In function `XXX': undefined reference to `YYY'
Tytułowy błąd najczęściej występuje gdy kompilator (a dokładniej linker) nie może znaleźć odpowiedniego symbolu (YYY) do wstawienia w miejsce wywołania, które z kolei znajduje się najczęściej (jak łatwo zgadnąć) w funkcji XXX.
Powody takiej sytuacji mogą być co najmniej trzy:
- niezdefiniowany symbol YYY
- linker nie może znaleźć obiektu YYY
- próba kompilacji szablonu
Pierwszy przypadek nie jest bardzo ciekawy (czyt. łatwo taki błąd znaleźć i naprawić. Wystarczy poszukać jakiego symbolu nie mamy definicji i ową uzupełnić.
Drugi przypadek jest trochę ciekawszy - pojawia się przy projektach z większą liczbą plików, które są kompilowane osobno. W tym przypadku buga należy szukać w pliku zawierającego instrukcje dla linkera (zwykle jest to Makefile lub coś pokrewnego), trzeba sprawdzić czy wszystkie skompilowane źródła pojawiają się na liście argumentów programu łączącego. Jeśli zależności są ok - trzeba sprawdzić czy zaginiony symbol jest w ogóle zdefiniowany (jak w pkt 1) .
Na trzeci przypadek natknąłem się przy pogwałceniu zasady pisania szablonów: "Wszystkie deklaracje i definicje szablonu muszą znajdować się w nagłówku". Jako że lubię mieć porządek w swoich plikach, tzn. podział na deklaracje i definicje (.hpp i .cpp), pomyślałem że szablon potraktuje tak samo: podzielę go. Jak się łatwo domyślić, próba kompilacji takiego tworu skończy się w/w błędem, gdyż definicje funkcji szablonowych muszą być obecne przy ich specjalizacji - muszą być widoczne dla kodu który ich używa. Rozwiązania tego problemu są dwa: pisać szablony w jednym pliku lub... dołączać pod koniec nagłówka definicje funkcji za pomocą #include.
Otagowano: the_bug,
Komentarze do wpisu
Możesz śledzić odpowiedzi poprzez kanał RSS. Możesz dodać komentarz lub zostawić ślad (trackback) ze swojego bloga.
Jeszcze nie ma żadnych komentarzy. Twój może być pierwszy.
Dodaj komentarz