在动态库中包含静态库

发布于 2024-09-19 21:04:33 字数 414 浏览 6 评论 0原文

我有以下问题:

  • 几个目标文件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 中,但我找不到它。

感谢您的帮助。

I have the following problem :

  • several object files a1.o, a2.o, a3.o, ...
  • an archive libxxxx.a.
    The archive libxxxx.a only contains object files : b1.o, b2.o etc...

I would like to create a shared library (.so) from all the object files.

Problem : If I use :

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

g++ does understand that I want to link with the static library libxxxx.a and does not include all the symbols of the archive.

A simple workaround is to first expand the archive using ar -x and then create the lib but it's not really "elegant".

There must be a simple command to force g++ to include the whole archive in the .so but I can't find it.

Thanks for your help.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

恰似旧人归 2024-09-26 21:04:33

来自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<,否则将找不到目标文件中使用的符号和静态库中定义的符号/code> 链接器选项。如果您只想包含静态库中所需的符号,则需要将其放在目标文件之后

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

From man ld:

--whole-archive
For each archive mentioned on the command line after the --whole-archive option, include every object file in the archive in the
link, rather than searching the archive for the required object files. This is normally used to turn an archive file into a shared
library, forcing every object to be included in the resulting shared library. This option may be used more than once.

Two notes when using this option from gcc: First, gcc doesn't know about this option, so you have to use -Wl,-whole-archive.
Second, don't forget to use -Wl,-no-whole-archive after your list of archives, because gcc will add its own list of archives to your
link and you may not want this flag to affect those as well.

Example:

g++ -shared -o yourlib a.o. b.o. c.o -Wl,-whole-archive libstatic.a -Wl,-no-whole-archive

Note also that in your example you first put static library, then the object files - in this case the symbols used in the object files and defined in static library will not be found unless you use --whole-archive linker option. If you want to include just the needed symbols from the static library, you need to put it after the object files.

g++ -o your_app a.o b.o c.o -lyour_static_lib
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文