我有以下问题:
- 几个目标文件 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(使用前将#替换为@)