我在使用 GCC/Linux 构建共享库时遇到问题。目前这个共享库是使用 GCC/libtool 选项“-shared”创建的,一切都很好。
现在有两个额外的静态库(.a-files)必须添加到这个共享库中,因为它们提供了共享库所需的一些功能。使用选项“-l”添加这些静态库没有帮助,之后它们不是 .so 文件的一部分。
那么如何强制 GCC/libtool 真正将这些静态库的代码添加到共享库中呢?
谢谢!
我在使用 GCC/Linux 构建共享库时遇到问题。目前这个共享库是使用 GCC/libtool 选项“-shared”创建的,一切都很好。
现在有两个额外的静态库(.a-files)必须添加到这个共享库中,因为它们提供了共享库所需的一些功能。使用选项“-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 使用此选项时有两个注意事项:首先,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