我有以下问题:
我想从所有目标文件创建一个共享库(.so)。
问题:如果我使用:
g++ -shared libxxxx.a a1.o a2.o ... -o libnew.so
g ++确实理解我想要链接静态库libxxxx.a并且不包含存档的所有符号。
一个简单的解决方法是首先使用ar -x
展开存档,然后创建lib,但它并不是“优雅”。
必须有一个简单的命令强制g ++将整个档案包含在.so中,但我找不到它。
感谢您的帮助。
答案 0 :(得分:6)
来自man ld
:
<强> - 全 - 归档强>
对于--whole-archive选项后命令行中提到的每个存档,包括存档中的每个目标文件 链接,而不是在存档中搜索所需的目标文件。这通常用于将存档文件转换为共享文件 库,强制每个对象都包含在生成的共享库中。此选项可能会被多次使用。从gcc使用此选项时的两个注意事项:首先,gcc不知道此选项,因此您必须使用-Wl,-whole-archive。 其次,不要忘记在归档列表之后使用-Wl,-no-whole-archive,因为gcc会将自己的归档列表添加到您的归档中 链接,你可能不希望这个标志也影响那些。
示例:
g++ -shared -o yourlib a.o. b.o. c.o -Wl,-whole-archive libstatic.a -Wl,-no-whole-archive
另请注意,在您的示例中,首先放置静态库,然后是目标文件 - 在这种情况下,除非使用--whole-archive
链接器选项,否则将找不到目标文件中使用的并在静态库中定义的符号。如果您只想在静态库中包含所需的符号,则需要将它after
放在目标文件中。
g++ -o your_app a.o b.o c.o -lyour_static_lib