Object 在动态库中包含静态库

Object 在动态库中包含静态库,object,g++,shared-libraries,archive,Object,G++,Shared Libraries,Archive,我有以下问题: 几个对象文件a1.o、a2.o、a3.o、 档案库libxxxx.a。 归档文件libxxxx.a仅包含以下对象文件:b1.o、b2.o等 我想从所有对象文件创建一个共享库(.so) g++ -o your_app a.o b.o c.o -lyour_static_lib 问题:如果我使用: g++ -shared libxxxx.a a1.o a2.o ... -o libnew.so g++知道我想链接到静态库libxxxx.a,但不包括归档文件的所有符号 一个简单

我有以下问题:

  • 几个对象文件a1.o、a2.o、a3.o、
  • 档案库libxxxx.a。 归档文件libxxxx.a仅包含以下对象文件:b1.o、b2.o等
我想从所有对象文件创建一个共享库(.so)

g++ -o your_app a.o b.o c.o -lyour_static_lib
问题:如果我使用:

g++ -shared libxxxx.a a1.o a2.o ... -o libnew.so
g++知道我想链接到静态库libxxxx.a,但不包括归档文件的所有符号

一个简单的解决方法是首先使用
ar-x
扩展归档文件,然后创建lib,但它并不真正“优雅”

必须有一个简单的命令来强制g++在中包含整个存档。所以我找不到它


谢谢你的帮助。

来自
曼恩ld

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

使用gcc中的此选项时需要注意两个问题:首先,gcc不知道此选项,所以必须使用-Wl,-whole archive。 其次,不要忘记在您的归档列表之后使用-Wl,-no-wholearchive,因为gcc会将自己的归档列表添加到您的归档列表中 链接,您可能不希望此标志也影响这些

例如:

g++ -shared -o yourlib a.o. b.o. c.o -Wl,-whole-archive libstatic.a -Wl,-no-whole-archive
还请注意,在您的示例中,您首先放置了静态库,然后对象文件—在本例中,除非您使用
--整个存档
链接器选项,否则将找不到在对象文件中使用并在静态库中定义的符号。如果只想包含静态库中所需的符号,则需要将其置于对象文件之后

g++ -o your_app a.o b.o c.o -lyour_static_lib

非常感谢。这正是我想要的。我在搜索时错过了这面旗帜!