在动态库中包含静态库 [英] Include static lib in dynamic lib

查看:47
本文介绍了在动态库中包含静态库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下问题:

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

我想从所有对象文件创建一个共享库 (.so).

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

问题:如果我使用:

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

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

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

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

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

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

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

感谢您的帮助.

推荐答案

来自 man ld:

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

--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.

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

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.

示例:

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

还要注意,在您的示例中,您首先放置静态库,然后放置目标文件 - 在这种情况下,除非您使用 --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

这篇关于在动态库中包含静态库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆