Autor Wątek: GLFW - symbol lookup error, undefined symbol  (Przeczytany 3912 razy)

Offline reidar

  • Użytkownik

# Marzec 21, 2013, 00:57:47
Niedawno zostałem użytkownikiem linuxa (Fedora 18) i chciałem napisać aplikację używając GLFW:
#define GLFW_INCLUDE_GL3
#include <GL/glfw.h>

int main() {

    glfwInit();

    glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3);
    glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 1);
    glfwOpenWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);

    glfwOpenWindow(640,480,8,8,8,8,24,0,GLFW_WINDOW);

    glfwTerminate();

    return 0;
}

Wszystko pięknie - kompilacja zakończona sukcesem, ale podczas uruchamiania programu z poziomu code::blocksa w Xtermie pojawia się:
Cytuj
(...)/glfwtest: symbol lookup error: (...)/glfwtest: undefined symbol: glfwOpenWindowHint
Dodam że (...) to ścieżka katalogu pliku :P, a undefined symbol pojawia się przy pierwszym wywołaniu jakiejkolwiek funkcji glfw* po glfwInit(). Jeżeli usunę wszystkie wywołania glfw*() między glfwInit(), a glfwTerminate() to błąd nie występuje. Dodam jeszcze, że glfwInit() zwraca GL_TRUE. Co robię źle lub czego nie robię (i też źle)?

P.S. Nie byłem pewny, w którym dziale umieścić temat, zastanawiałem się też nad Szkółką i Programowaniem Grafiki, ale ostatecznie dział Linux wydał mi się najbardziej odpowiedni.

Pozdrawiam

Offline Mr. Spam

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

Offline Hail The Mush...

  • Użytkownik

# Marzec 21, 2013, 01:04:45
Sprawdz, czy masz dobre biblioteki!

Offline reidar

  • Użytkownik

# Marzec 21, 2013, 01:08:56
Dobre to znaczy?
Biblioteki kompilowałem ze źródeł (glfw-2.7.7) przez "make x11-install", także chyba są dobre. Ale pewnie się mylę, budowanie bibliotek ze źródeł nigdy nie było moją mocną stroną, a i w linuxie jestem totalnym noobem :P

Offline Adam7

  • Użytkownik
    • warsztat.gd

# Marzec 21, 2013, 01:19:07
Samo skompilowanie to nie wszystko, musisz jeszcze wrzucić je w odpowiednie miejsce, by były widoczne dla innych programów.

Offline Paweł

  • Użytkownik

# Marzec 21, 2013, 01:21:45
Jak wydał polecenie make install to logiczne chyba że zainstalował bibliotekę.
@autor:
Pokaż opcje linkera. Tu masz napisane jak poprawnie linkować: http://www.glfw.org/release-2.7.7.html#4_using_glfw

Jak nie wiesz jak zbudować pakiet to ściągnij skompilowany np. tak(w terminalu):
sudo yum install glfw

Offline reidar

  • Użytkownik

# Marzec 21, 2013, 01:24:00
No... próbowałem wrzucić libglfw.so do folderu z plikiem wykonywalnym jak to przyjęło się robić z dll ale chyba nie tędy droga...

Offline Paweł

  • Użytkownik

# Marzec 21, 2013, 01:29:55
No oczywiście że nie. Od tego jest pkg-config.
Ja ma w C::B w project properites->build options->linker settings -> other options coś takiego:
`pkg-config --cflags --libs glew`
`pkg-config --cflags --libs x11`
-lGL
`pkg-config --cflags --libs glib-2.0`
`pkg-config --cflags  --libs libglfw`
-lrt
`pkg-config --cflags --libs  xrandr`
« Ostatnia zmiana: Marzec 21, 2013, 01:32:01 wysłana przez Paweł »

Offline reidar

  • Użytkownik

# Marzec 21, 2013, 02:00:51
U siebie miałem:
Cytuj
-lGL
-lglfw
I się kompilowało, po zmienie na Twoje opcje linkera wywala znane i (nie)lubiane undefined reference do wszystkich funkcji glfw, czyli tak jakby nie widzało tej paczuszki chociaż mam ją w /usr/local/lib/pkgconfig
« Ostatnia zmiana: Marzec 21, 2013, 02:05:48 wysłana przez reidar »

Offline hashedone

  • Użytkownik

  • +1
# Marzec 21, 2013, 10:56:46
Instalując ze źródeł musiał byś ręcznie bibliotekę do pkg-config dodać. Pytanie brzmi - czemu instalowałeś ze źródeł zamiast z repo?

Offline reidar

  • Użytkownik

# Marzec 21, 2013, 16:19:01
No cóż - przyzwyczajenie z Windowsa. Postanowiłem naprawić swój błąd i zainstalować z repo:
Cytuj
yum install glfw-devel.x86_64
Dowiedziałem się, że mam ten pakiet zainstalowany w aktualnej wersji, więc żeby było zrobione na "czysto" - przeinstalowałem. No i tu moje wielkie zaskoczenie undefined reference teraz występowało tylko do glfwOpenWindowHint() i glfwOpenWindow()...
Poszperałem w necie i okazało się, glfw migrował na wersję 3.0.0. Zmiany można obczaić tu - http://www.glfw.org/docs/3.0/moving.html. No i wyszło na to, że pozmieniali większość nazw funkcji :). Ale żeby nie było zbyt łatwo to, pomimo, że u mnie glfwGetVersion() zwraca 3.0.0 to funkcje w wersji zainstalowanej u mnie różnią się też przyjmowanymi argumentami (co do specyfikacji) :O np.:

w specyfikacji:
GLFWwindow * glfwCreateWindow (int width, int height, const char *title, GLFWmonitor *monitor, GLFWwindow *share);

u mnie:
GLFWwindow glfwCreateWindow ( int width, int height, int mode, const char* title, GLFWwindow share);

widzę, że czeka mnie sporo zabawy... :)
A może lepiej po prostu poczekać na aktualną (poprawną, zgodną ze specyfikacją) wersję w repo?
« Ostatnia zmiana: Marzec 21, 2013, 16:28:02 wysłana przez reidar »

Offline Paweł

  • Użytkownik

# Marzec 21, 2013, 16:32:21
Po pierwsze: jeśli pakiet oznaczony jest jako devel to najczęściej są to same źródła. Jak chcesz skompilowaną bibliotekę zainstaluj  glfw.x86_64
Po drugie: linkuj statycznie - na początku zaoszczędzi ci to problemów, a "undefined reference" dostaniesz od razu przy linkowaniu a nie uruchomieniu.
Po trzecie: jeśli programujesz w C a nie w C++ to masz dwa wyjścia:
  1. przesiąść się na C++
  2. zacząć zwracać uwagę na warningi szczególnie te o "implict declaration".

Offline reidar

  • Użytkownik

# Marzec 21, 2013, 17:10:49
Piszę w c++, żadnych warningów nie dostawałem, teraz się zastanawiam czy czekać na to aż glfw 3.0.0 będzie "oficjalnie wydane". Dziwi mnie fakt, że ściągając z repo dostaje wersję 3.0.0, chociaż na www.glfw.org jest napisane że najnowsza to 2.7.7

Offline Paweł

  • Użytkownik

# Marzec 27, 2013, 01:48:24
@OP: w takim razie includuj glfw3.h zamiast glfw.h
A i wygląda na to że w paczkach fedory nie ma aktualnej wersji glfw3, także trzeba kompilować ręcznie.
« Ostatnia zmiana: Marzec 27, 2013, 03:45:05 wysłana przez Paweł »