在动态库中包含静态库

时间:2010-09-20 15:23:45

标签: object g++ shared-libraries archive

我有以下问题:

  • 几个目标文件a1.o,a2.o,a3.o,...
  • 存档libxxxx.a。 存档libxxxx.a仅包含目标文件:b1.o,b2.o等...

我想从所有目标文件创建一个共享库(.so)。

问题:如果我使用:

g++ -shared libxxxx.a a1.o a2.o ... -o libnew.so

g ++确实理解我想要链接静态库libxxxx.a并且不包含存档的所有符号。

一个简单的解决方法是首先使用ar -x展开存档,然后创建lib,但它并不是“优雅”。

必须有一个简单的命令强制g ++将整个档案包含在.so中,但我找不到它。

感谢您的帮助。

1 个答案:

答案 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