在构建期间将静态库链接到共享库?

时间:2013-02-15 07:22:08

标签: linux gcc shared-libraries static-libraries libtool

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

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

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

谢谢!

2 个答案:

答案 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
相关问题