在动态库中包含静态库

ThR*_*R37 3 g++ object 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
Run Code Online (Sandbox Code Playgroud)

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

一个简单的解决方法是首先使用ar -x然后创建lib 来扩展存档,但它并不是真正的"优雅".

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

谢谢你的帮助.

Dmi*_*kov 6

来自man ld:

--whole-archive
对于--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
Run Code Online (Sandbox Code Playgroud)

另请注意,在您的示例中,您首先放置静态库,然后是目标文件 - 在这种情况下,除非使用--whole-archive链接器选项,否则将找不到目标文件中使用的和静态库中定义的符号.如果要仅包含静态库中所需的符号,则需要将其after放在目标文件中.

g++ -o your_app a.o b.o c.o -lyour_static_lib
Run Code Online (Sandbox Code Playgroud)