我写了一个类似以下的makefile:
COMPILER = g++
COMPILER_FLAGS = -c -g -O0 -Wall -w
EXEC=mhu9_mp3
LD = g++
LINKER = g++
mhu9_mp3 : mhu9_mp3.o teapot.o EasyBMP.o
$(LD) teapot.o mhu9_mp3.o EasyBMP.o -L./SOIL/lib -lSOIL -o mhu9_mp3 -L./usr/lib -lGL -lGLU -lglut -lGLEW
teapot.o : teapot.cpp teapot.h
$(COMPILER) $(COMPILER_FLAGS) teapot.cpp
mhu9_mp3.o : mhu9_mp3.cpp teapot.h
$(COMPILER) $(COMPILER_FLAGS) mhu9_mp3.cpp
EasyBMP.o : EasyBMP_1.06/EasyBMP.cpp
$(COMPILER) $(COMPILER_FLAGS) EasyBMP_1.06/EasyBMP.cpp
clean:
-rm -f *.o mhu9_mp3
其中libSOIL.a
是静态库(我使用“-L./SOIL/lib -lSOIL
”链接它)和-lGL -lGLU -lglut -lGLEW是动态库。我把它们放在同一条线上。在我的cpp文件中,我有一个函数调用,它调用SOIL.h中定义的函数。但是,当我编译时,我收到了这个错误:
undefined reference to `SOIL_load_image'
我很确定我已经包含了头文件SOIL.h
,并且我已经在静态库libSOIL.a
中进行了链接。那么这个错误的原因是什么?我尝试在-static
之前添加-lSOIL
标志,但链接器错误地认为其他动态库是静态的。有没有更好的方法可以同时链接静态库和动态库?
答案 0 :(得分:0)
-static
的对方是-Bdynamic
。所以,如果你真的需要,它可能就像
ld -o foo foo.o -static -lstaticlib -Bdynamic -ldynamiclib0 -ldynamiclib1
但是,只有在存在动态库和静态库时才有意义。如果只存在一个,链接器将自己选择一个。
在您的情况下,问题可能是由于错误的链接顺序或SOIL_load_image
确实遗漏(使用nm
或objdump
验证)。
答案 1 :(得分:0)
将动态库列表放在静态库列表之前。
示例:
$(LD) -L<path> -l<dynamiclib1> -l<dynamiclib2> -static -l<staticlib1> -l<staticlib2>