我在使用GCC / Linux构建共享库时遇到问题。目前这个共享库是使用GCC / libtool选项“-shared”创建的,一切都很好。
现在还有两个额外的静态库(.a文件)必须添加到此共享库中,因为它们提供了共享库所需的一些功能。使用选项“-l”添加这些静态库没有帮助,之后它们不属于.so文件。
那么如何强制GCC / libtool真正将这些静态库的代码添加到共享库中呢?
谢谢!
答案 0 :(得分:22)
在这种情况下,您需要--whole-archive
链接器选项来命令链接器将整个静态库的内容包含到共享库中。
g++ -shared sample.o -o libSample.so -Wl,-whole-archive -lmylib1.a -lmylib2.a -Wl,-no-whole-archive
来自man ld
:
对于 - 整个存档选项后命令行中提到的每个存档,请在链接中包含存档中的每个目标文件,而不是在存档中搜索所需的目标文件。这通常用于将存档文件转换为共享库,从而强制将每个对象包含在生成的共享库中。此选项可能会被多次使用。
从gcc使用此选项时的两个注意事项:首先,gcc不知道此选项,因此您必须使用-Wl,-whole-archive。其次,请不要忘记在归档列表后使用 -Wl,-no-whole-archive ,因为gcc会将自己的归档列表添加到您的链接中,您可能不希望此标记为也影响那些。
答案 1 :(得分:2)
您只需要 - 整个存档参数强制链接器包含库,但它应该能够从不匹配的符号推断出自己的需求。
确保命令行上的任何静态库都位于其依赖对象文件之后,例如:
g++ -Wl,-E -g -pipe -O2 -pipe -fPIC myobjectfile.o mystaticlibrary.a -shared -o mylib.so