J’essaie de comstackr le programme de test ci-dessous:
#include int main(int argc, char** argv) { if(!glfwInit()) { return -1; } if(!glfwOpenWindow(640, 480, 8, 8, 8, 0, 24, 0, GLFW_WINDOW)) { return -1; } while(glfwGetWindowParam(GLFW_OPENED)) { glfwSwapBuffers(); } return 0; }
mais je reçois toujours undefined reference
erreurs de undefined reference
en ce qui concerne les fonctions de GLFW.
Ci-dessous mon makefile:
CXX = clang++ CXXFLAGS = -Wall -std=c++0x LDFLAGS = -lglfw OBJ_DIR = bin LIB_DIR = -L/usr/lib INC_DIR = -I/usr/include SOURCE = main.cpp OBJECTS = ${SOURCE:%.cpp=$(OBJ_DIR)/%.o} EXECUTABLE = hello all: init $(OBJECTS) $(EXECUTABLE) $(EXECUTABLE): $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIB_DIR) -o $@ $(OBJECTS) $(OBJ_DIR)/%.o: %.cpp $(CXX) $(INC_DIR) -c $< -o $@ init: @mkdir -p "$(OBJ_DIR)" clean: @rm -rf $(OBJ_DIR) $(EXECUTABLE)
J’ai certainement glfw.h
et libglfw.a/.so
Comme lorsque je lance locate glfw
je reçois:
:~$ locate glfw /usr/include/GL/glfw.h /usr/lib/libglfw.a /usr/lib/libglfw.so /usr/lib/libglfw.so.2 /usr/lib/libglfw.so.2.6
La sortie de nm /usr/lib/libglfw.a | grep glfwInit
nm /usr/lib/libglfw.a | grep glfwInit
:
:~$ nm /usr/lib/libglfw.a | grep glfwInit U _glfwInitialized U _glfwInitialized U _glfwInitialized U _glfwInitialized 0000000000000000 B _glfwInitialized 0000000000000000 T glfwInit U _glfwInitialized U _glfwInitialized U _glfwInitialized U _glfwInitialized U _glfwInitialized U _glfwInitJoysticks U _glfwInitTimer 00000000000000c0 T _glfwInitJoysticks 0000000000000000 T _glfwInitTimer
et le message détaillé de Clang:
clang++ -I/usr/include -c main.cpp -o bin/main.o clang++ -Wall -std=c++0x -Wl --verbose -lglfw -lGL -lGLU -L/usr/lib -o hello bin/main.o Ubuntu clang version 3.0-6ubuntu3 (tags/RELEASE_30/final) (based on LLVM 3.0) Target: x86_64-pc-linux-gnu Thread model: posix clang: warning: argument unused during compilation: '-std=c++0x' "/usr/bin/ld" -z relro --hash-style=gnu --as-needed --build-id --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o hello /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o -L/usr/lib -L/usr/lib/gcc/x86_64-linux-gnu/4.6 -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu -L/lib/x86_64-linux-gnu -L/lib/../lib64 -L/usr/lib/x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../.. -L/lib/x86_64-linux-gnu -L/lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib -lglfw -lGL -lGLU bin/main.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crtn.o bin/main.o: In function `main': main.cpp:(.text+0x17): undefined reference to `glfwInit' main.cpp:(.text+0x76): undefined reference to `glfwOpenWindow' main.cpp:(.text+0x97): undefined reference to `glfwGetWindowParam' main.cpp:(.text+0xa7): undefined reference to `glfwSwapBuffers' clang: error: linker command failed with exit code 1 (use -v to see invocation) make: *** [hello] Error 1
Il semble ne pas trouver la bibliothèque?
Le problème est que les bibliothèques glfw sont spécifiées dans l’éditeur de liens avant le fichier object qui en dépend. ld
cherche dans les bibliothèques pour résoudre les dépendances uniquement les dépendances qu’il connaît au moment de la liste des fichiers qu’il traite. Ainsi, lorsque ld
recherche dans libglfw.a
il ne connaît pas encore la dépendance main.o
dans main.o
ld
(par défaut) ne retourne pas dans la bibliothèque.
Essayer:
$(EXECUTABLE): $(CXX) $(CXXFLAGS) $(LIB_DIR) -o $@ $(OBJECTS) $(LDFLAGS)
De plus, les bibliothèques devraient probablement être spécifiées dans une LDLIBS
(ou LIBS
) – LDFLAGS
est utilisé de manière conventionnelle pour les options de l’éditeur de liens:
CXX = clang++ CXXFLAGS = -Wall -std=c++0x LDLIBS = -lglfw -lGL -lGLU OBJ_DIR = bin LIB_DIR = -L/usr/lib INC_DIR = -I/usr/include SOURCE = main.cpp OBJECTS = ${SOURCE:%.cpp=$(OBJ_DIR)/%.o} EXECUTABLE = hello all: init $(OBJECTS) $(EXECUTABLE) $(EXECUTABLE): $(CXX) $(LDFLAGS) $(LIB_DIR) -o $@ $(OBJECTS) $(LDLIBS) $(OBJ_DIR)/%.o: %.cpp $(CXX) $(INC_DIR) -c $< -o $@ init: @mkdir -p "$(OBJ_DIR)" clean: @rm -rf $(OBJ_DIR) $(EXECUTABLE)