如何同时链接静态库和动态库?

时间:2013-11-07 03:14:04

标签: makefile

我写了一个类似以下的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标志,但链接器错误地认为其他动态库是静态的。有没有更好的方法可以同时链接静态库和动态库?

2 个答案:

答案 0 :(得分:0)

-static的对方是-Bdynamic。所以,如果你真的需要,它可能就像

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

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

在您的情况下,问题可能是由于错误的链接顺序或SOIL_load_image确实遗漏(使用nmobjdump验证)。

答案 1 :(得分:0)

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

示例:

$(LD) -L<path> -l<dynamiclib1> -l<dynamiclib2> -static -l<staticlib1> -l<staticlib2>