W tym filmie porozmawiamy o błędach linkera i dlaczego mogą się one zdarzyć.
Błędy linkera pojawiają się, gdy linker próbuje złożyć wszystkie kawałki programu razem, aby utworzyć
plik wykonywalny i brakuje jednego lub więcej kawałków.
Zazwyczaj może się to zdarzyć, gdy plik obiektowy lub biblioteki nie mogą zostać znalezione przez linker.
Naprawianie błędów linkera może być podstępne.
Czasami jest to tylko kwestia uzyskania poprawnych ścieżek, aby linker wiedział, gdzie są brakujące
elementy.
Przejdźmy do code light i wymusimy na programie błąd linkera, abyś mógł zobaczyć, jak wygląda
komunikat o błędzie.
Przykładowy kod tutaj, proszę zignorować składnię.
Jest to właściwie kod C plus plus, ale nadal ma znaczenie dla błędów linkera.
Nie przejmuj się i o strumień.
Nie martw się o stdcout.
Główną ideą jest tutaj to, że błędy linków są takie same w C i C plus.
A przykład kodowania tutaj po prostu próbuje zademonstrować ponownie błąd linkera.
Więc jestem w code light i stworzyłem projekt o nazwie Linker Error oparty na szablonie, którego używamy.
Więc wszystko co mam to Main. plik cpp, który mówi Hello world.
Teraz wymusimy tutaj błąd linkera.
To nie jest coś, co chcesz zrobić normalnie, ale chcę to zrobić, aby pokazać, jak wygląda
błąd.
Więc to, co zamierzam powiedzieć, to powiem extern int c lub powiedzmy X i wyjaśnię ci to wszystko
za chwilę.
A potem w ciele głównym, chcę spróbować użyć tego X właśnie tam.
To tylko liczba całkowita i powiedzmy, że chcę ją wydrukować.
Chcę tylko wydrukować X, proste jak to.
Zapiszę to.
Teraz zobaczysz, jeśli skompiluję ten program, zobaczysz, co się stanie.
Klikam prawym przyciskiem myszy na kompilację.
Otrzymuję czystą kompilację.
W programie nie ma nic złego, ale kiedy próbuję go zbudować i uruchomić.
Można było zobaczyć błąd linkera.
Jest to klasyczny błąd linkera.
Nieokreślone odniesienie do czegoś.
W tym przypadku jest to po prostu x.
Zauważ też, że linker zwrócił tutaj jedynkę.
LD zwraca jeden, który jest statusem wyjścia.
Czyli coś było nie tak z linkiem.
Oczywiście kompilator był w porządku, ponieważ nie dostaliśmy żadnych błędów kompilatora.
Robimy to ponownie.
Jest kompilacja.
Żadnych błędów, żadnych ostrzeżeń.
Pozwólcie więc, że wyjaśnię wam, co się tu dzieje.
Pozwólcie, że szybko złapię mój rysik.
I co się tutaj dzieje, mam tutaj mój główny plik CPP i będzie on skompilowany do main dot zero, powiedzmy,
lub main dot object.
W tym miejscu mamy odniesienie do EXE.
Widać to właśnie tam.
Więc w tym miejscu mam odniesienie do exe, którego zamierzam użyć.
Teraz mamy również nasze biblioteki O stream, więc linker musi złapać te biblioteki i po prostu wpiszę i o
stream tutaj, abyś wiedział, o czym mówię.
Linker musi połączyć te dwa razem, aby stworzyć mój główny exe.
Lub w tym przypadku wierzę, że byłby to linker error exe.
Ale wiesz o co mi chodzi.
Więc kompilacja jest w porządku.
Stworzyliśmy nasz plik obiektowy.
Ta biblioteka istnieje.
Problem polega na tym, że powiedziałem tutaj kompilatorowi, że ten x nie jest we mnie.
To jest gdzieś indziej.
Definiuje ją ktoś inny.
No oczywiście, że nie jest definiowany przez kogoś innego, bo to niejako wymusiło tutaj kwestię.
Więc teraz linker musi rozwiązać ten X, To mówi, ok, gdzie gdzie dostanę tę wartość do drukowania?
Bo o to właśnie prosiłeś mnie tutaj, prawda?
Chcę, aby wydrukowało wartość x.
Gdzie jest x?
Nie może go znaleźć.
To jest właśnie błąd linkera.
To jest dokładnie to, co się dzieje.
I pozwól mi zbudować to ponownie, abyś mógł zobaczyć komunikat o błędzie po raz kolejny.
To jest build it and run it.
I jest komunikat o błędzie.
Mówi o niezdefiniowanym odwołaniu do X.
Można dokładnie zobaczyć, co się dzieje.
Nie może znaleźć X.
Teraz to nie jest błąd kompilatora.
To jest błąd linkera.
To naprawdę ważne, by to zrozumieć.
Błędy linkera są trudne do naprawienia.
Wiele razy brakuje plików, które trzeba połączyć.
Są w złych miejscach.
Nie musisz się martwić, że używając światła kodu w tym kursie, będziemy w zasadzie robić
wszystko sami.
Ale jeśli używasz bibliotek od stron trzecich, to jest to rodzaj rzeczy, o których będziemy mówić w bardziej średniozaawansowanym
lub zaawansowanym kursie.
Ale chciałem tylko pokazać błędy linkera na wypadek, gdybyś wymyślił jeden, opublikuj go na forum i będziemy
pracować przez niego razem.