我正在尝试编译以下测试程序:
@H_404_2@#include <GL/glfw.h>
int main(int argc,char** argv) {
if(!glfwInit()) {
return -1;
}
if(!glfwOpenWindow(640,480,8,24,GLFW_WINDOW)) {
return -1;
}
while(glfwGetWindowParam(GLFW_OPENED)) {
glfwSwapBuffers();
}
return 0;
}
@H_301_25@解决方法
下面是我的makefile:
@H_404_2@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)我肯定有glfw.h和libglfw.a / .so,因为当我运行locate glfw时,我得到:
@H_404_2@:~$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输出nm /usr/lib/libglfw.a | grep glfwInit:
@H_404_2@:~$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来自clang的详细消息:
@H_404_2@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好像找不到图书馆?
问题是glfw库是在依赖于它们的目标文件之前指定给链接器的. ld搜索库以仅针对它正在处理的文件列表中所知的依赖关系来解析依赖关系.所以当ld搜索libglfw.a时,它还不知道main.o中的glfwInit依赖. ld(默认情况下)不再返回搜索库.
尝试:
@H_404_2@$(EXECUTABLE): $(CXX) $(CXXFLAGS) $(LIB_DIR) -o $@ $(OBJECTS) $(LDFLAGS)此外,库可能应在LDLIBS(或LIBS)变量中指定 – LDFLAGS通常用于链接器选项:
@H_404_2@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)