在动态库中包含静态库

2024-01-13

我有以下问题:

  • 几个目标文件 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然后创建库,但它并不真正“优雅”。

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

感谢您的帮助。


From man ld:

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

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

Example:

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在动态库中包含静态库 的相关文章

随机推荐