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

使用GCC / Linux构build共享库时遇到问题。 目前这个共享库是用GCC / libtool选项“-shared”创build的,一切正常。

现在有两个额外的静态库(.a-files)必须被添加到这个共享库中,因为它们提供了共享所需的一些function。 添加这些静态库的选项“-l”没有帮助,之后他们不是.so文件的一部分。

那么我怎么能强制GCC / libtool真的把这些静态库的代码添加到共享库中呢?

谢谢!

Solutions Collecting From Web of "在构build期间将静态库链接到共享库?"

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

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

man ld

对于在命令行中提到的每个归档文件–whole-archive选项之后,将链接中的每个对象文件都包含在归档文件中,而不是在归档文件中搜索所需的对象文件。 这通常用于将档案文件转换为共享库,强制将每个对象包含在生成的共享库中。 这个选项可能会被多次使用。

从gcc使用这个选项时有两点需要注意:首先,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