1

我写了一个如下的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但链接器错误地假设其他动态库是静态的。有没有更好的方法同时链接静态库和动态库?

4

2 回答 2

0

将动态库列表放在静态库列表之前。

例子:

$(LD) -L<path> -l<dynamiclib1> -l<dynamiclib2> -static -l<staticlib1> -l<staticlib2>
于 2013-11-07T07:57:07.483 回答
0

对应的-static-Bdynamic。所以如果你真的需要,它可能是这样的

ld -o foo foo.o -static -lstaticlib -Bdynamic -ldynamiclib0 -ldynamiclib1

但是,这仅在同时存在动态库和静态库时才有意义。如果只有一个存在,链接器将自己选择一个。

在您的情况下,问题可能是由错误的链接顺序或SOIL_load_image确实丢失的事实引起的(使用nm或进行验证objdump)。

于 2013-11-07T06:46:41.677 回答