Artykuły, C/C++, g++, Programowanie, The Bug

In function `XXX': undefined reference to `YYY'

11 lipca, 2011 o 23:11:57 Dodaj komentarz Poziom: 1 Permalink

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: ,

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

Textile Lite włączony ( szczegółowy opis znaczników ):