Autor Wątek: "undefined reference to..." czyli własna biblioteka *.lib dla funkcji OpenGL  (Przeczytany 996 razy)

zi0lk0

  • Gość
# Sierpień 03, 2007, 21:51:22
Ostatnio postanowiłem usprawnić sobie nieco pracę w środowisku Windows i piszę bibliotekę(statyczną) dzięki której nie będę musiał tworząc gry zaprzątać sobie głowy podstawowymi rzeczami typu inicjalizacja okna, obsługa komunikatów czy inicjalizacja OpenGL. Jednak z tym ostatnim mam problem. Mam w swojej bibliotece funkcję void InicjujOpenGL() no i są tam te funkcje, które inicjują mi OpenGL(jak wskazuje nazwa zresztą :p). Problem w tym, że gdy kompiluję bibliotekę(nie wiem czy bibliotekę się 'kompiluje' czy to jakos inaczej sie nazywa ;) ) to wszystko jest ok, ale już dołanczając ją do jakiegoś projektu wyskakuje mi "undefined reference to wglCreateContext@4 " czyli typowy nobowski komunikat o który pytają się na każdym forum internetowym :P Oczywiście dodałem do projektu(a w akcie desperacji także przy kompilacji biblioteki) wszystkie biblioteki OpenGL i pliki nagłówkowe. Jednak nie mogę tego przeskoczyć :/

Podobny komunikat czyli undefined reference to...  pojawia się odnośnie wszystkich funkcji OpenGL-owskich.

Zaznaczam, że gdy wywołuję funkcje OpenGL bezpośrednio z projektu(czyli wywołania tych funkcji są w kodzie źródłowym projektu a nie jakiejś tam biblioteki) to wszystko jest w porządku, czyli problem nie dotyczy tego, że nie załadowałem jakiśtam bibliotek...

Pozdrawiam.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

zi0lk0

  • Gość
# Sierpień 03, 2007, 22:03:16
1) Twój problem nie ma wiele wspólnego z C++ a raczej z kompilatorem i IDE którego używasz -- przenoszę.
2) Nie napisałeś czego używasz ale pewnie jakiegoś VC++, otóż problem jaki widzę, to udekorowana (ang. mangled) funkcja wglCreateContext(). To jest funkcja w C i kompilator powinien szukać nieudekorowanej wersji. Co należy zrobić aby tak było niestety nie wiem -- nie używam VC++.

// edit
Ad. 2: mój błąd, to @4 to wynik __stdcall a nie dekorowania C++.
« Ostatnia zmiana: Sierpień 03, 2007, 22:32:28 wysłana przez bies »

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Sierpień 03, 2007, 22:11:09
Cytuj
Oczywiście dodałem do projektu(a w akcie desperacji także przy kompilacji biblioteki) wszystkie biblioteki OpenGL i pliki nagłówkowe.
To powinno wystarczyć (plików nagłówkowych nie musisz dodawać), jednak jeżeli uzywasz GCC (np. spod DevC++ lub Code::Blocks), to ważna jest też kolejność podanych linkerowi bibliotek - biblioteka korzystająca z funkcji musi być wymieniona przed biblioteką te funkcje udostępniającą (czyli liby opengl32 i gdi32 idą na koniec).

zi0lk0

  • Gość
# Sierpień 03, 2007, 22:33:35
1) Twój problem nie ma wiele wspólnego z C++ a raczej z kompilatorem i IDE którego używasz -- przenoszę.
2) Nie napisałeś czego używasz ale pewnie jakiegoś VC++, otóż problem jaki widzę, to udekorowana (ang. mangled) funkcja wglCreateContext(). To jest funkcja w C i kompilator powinien szukać nieudekorowanej wersji. Co należy zrobić aby tak było niestety nie wiem -- nie używam VC++.

Ad.1) Sorka. Jakoś nie zauważyłem tego działu   :-[ Mój błąd    ::)
Ad.2) Używam Code::Blocks z kompilatorem MinGW.

Cytat: Krzysiek K
To powinno wystarczyć (plików nagłówkowych nie musisz dodawać), jednak jeżeli uzywasz GCC (np. spod DevC++ lub Code::Blocks), to ważna jest też kolejność podanych linkerowi bibliotek - biblioteka korzystająca z funkcji musi być wymieniona przed biblioteką te funkcje udostępniającą (czyli liby opengl32 i gdi32 idą na koniec).

Człowieku. Nóżki całuje  ;) Kurcze nie wiem dlaczego ale zdawało mi się że z tą kolejnością bibliotek powinno być dokładnie odwrotnie :P ale tak to jest jak sie uczy z tutoriali a nie z książek  :-\

P.S. Problem rozwiązany