在构建过程中将静态库链接到共享库中?

20

我在使用GCC/Linux构建共享库时遇到了问题。目前,这个共享库是使用GCC/libtool选项"-shared"创建的,一切都很好。

现在有两个额外的静态库(.a文件)必须添加到此共享库中,因为它们提供了共享库所需的某些功能。使用"-l"选项添加这些静态库没有帮助,之后它们不会成为.so文件的一部分。

那么,如何强制GCC/libtool将这些静态库的代码真正添加到共享库中呢?

谢谢!


要创建可执行文件,您只需将静态库的完整路径添加到gcc的构建选项中,例如:gcc -Wall -g live_mystuff.c -o my_app /usr/local/src/ffmpeg/libswscale/libswscale.a -lpthread -lbz2 -lm -lz -lfaac -lmp3lame -lx264 -lfaad ... 这也可能适用于创建共享库。试试看。 - Ferenc Deak
你怎么知道它们“不是.so文件的一部分”? - Some programmer dude
@fritzone:对于能够无问题运行的可执行文件,我必须为共享库做同样的事情。 - Elmi
@Joachim:有两个原因:共享库不会变得更大,当将可执行文件与其链接时,它会抱怨缺少函数-这些函数驻留在静态库中。 - Elmi
你如何链接共享库?请展示完整的命令行或Makefile输出。 - Some programmer dude
@Joachim:目前我使用libtool进行构建: libtool --mode=compile g++ -Wall -fPIC -shared -Wno-unused -D_REENTRANTlibtool --mode=link g++ -shared -rpath /usr/lib 现在当我在其中一个或两个语句中添加-lmystaticlib时,似乎被忽略了... - Elmi
2个回答

27

在这种情况下,您需要使用--whole-archive链接器选项,以命令链接器将整个静态库的内容包含到共享库中。

g++ -shared sample.o -o libSample.so -Wl,-whole-archive -lmylib1.a -lmylib2.a -Wl,-no-whole-archive

来自man ld

在使用--whole-archive选项后,命令行上每个提到的归档文件中包含每个对象文件的链接,而不是搜索需要的对象文件。 此选项通常用于将存档文件转换为共享库,强制将结果共享库中的每个对象都包含在内。 可以多次使用此选项。

使用该选项时有两点需要注意:首先,gcc不知道这个选项,因此必须使用-Wl,-whole-archive。 其次,在列出您的存档列表之后,不要忘记使用-Wl,-no-whole-archive,因为gcc会添加其自己的存档列表到您的链接中,并且您可能不希望该标志也影响它们。


在SunOS上,我必须在“-WL,”之后使用两个破折号。 - stefanct

3

您只需要使用--whole-archive参数,就可以强制链接器包含库文件,但它应该能够从未匹配的符号中推断出自己的需求。

请确保命令行上任何静态库都在其依赖的对象文件之后,例如:

g++ -Wl,-E -g -pipe -O2 -pipe -fPIC  myobjectfile.o mystaticlibrary.a -shared -o mylib.so

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接