我在使用GCC/Linux构建共享库时遇到了问题。目前,这个共享库是使用GCC/libtool选项"-shared"创建的,一切都很好。
现在有两个额外的静态库(.a文件)必须添加到此共享库中,因为它们提供了共享库所需的某些功能。使用"-l"选项添加这些静态库没有帮助,之后它们不会成为.so文件的一部分。
那么,如何强制GCC/libtool将这些静态库的代码真正添加到共享库中呢?
谢谢!
我在使用GCC/Linux构建共享库时遇到了问题。目前,这个共享库是使用GCC/libtool选项"-shared"创建的,一切都很好。
现在有两个额外的静态库(.a文件)必须添加到此共享库中,因为它们提供了共享库所需的某些功能。使用"-l"选项添加这些静态库没有帮助,之后它们不会成为.so文件的一部分。
那么,如何强制GCC/libtool将这些静态库的代码真正添加到共享库中呢?
谢谢!
在这种情况下,您需要使用--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会添加其自己的存档列表到您的链接中,并且您可能不希望该标志也影响它们。
您只需要使用--whole-archive参数,就可以强制链接器包含库文件,但它应该能够从未匹配的符号中推断出自己的需求。
请确保命令行上任何静态库都在其依赖的对象文件之后,例如:
g++ -Wl,-E -g -pipe -O2 -pipe -fPIC myobjectfile.o mystaticlibrary.a -shared -o mylib.so
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