Unable to bind GLFW

I am trying to compile the test program below:

#include <GL/glfw.h> 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; } 

but I always get undefined reference errors regarding GLFW functions.

Below is my make file:

 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) 

I definitely have glfw.h and libglfw.a/.so , as when I run locate glfw I get:

 :~$ 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 

Output 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 

and a detailed message from 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 

It seems like not finding a library?

+7
source share
1 answer

The problem is that the glfw libraries are given to the linker in front of the object file, which depends on them. ld looks for libraries to resolve dependencies only for dependencies that he knows about, at a point in the list of files being processed. Therefore, when ld searches libglfw.a , it does not yet know about the glfwInit dependency in glfwInit ld (default) does not return the library search again.

Try:

 $(EXECUTABLE): $(CXX) $(CXXFLAGS) $(LIB_DIR) -o $@ $(OBJECTS) $(LDFLAGS) 

Libraries should also be specified in the LDLIBS (or LIBS ) variable - LDFLAGS usually used for linker options:

 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) 
+11
source

All Articles