如何强制gcc链接库中未被引用的静态C++对象

30
我正在使用一个可以构建为共享或静态库的C++库。该库使用工厂技术,在程序启动时静态对象会注册自己并创建这些静态对象。
只要使用共享库,这个工作就很好。当使用静态版本时,由于没有直接引用它们,所以所有的静态对象都没有被包含到最终的程序中,因此它们的功能不可用。
有办法强制gcc在链接时包含来自库的所有静态对象吗?
这个库是开源的,如果有帮助的话我可以修改它。
2个回答

31
你可以使用 -Wl,--whole-archive -lyourlib,有关更多信息,请参阅ld的手册。
在命令行上使用 -Wl,--whole-archive 后提到的任何静态库都会被完全包含,如果需要,你也可以再次关闭此选项,例如: -Wl,--whole-archive -lyourlib -Wl,--no-whole-archive -lotherlib

6
-Wl,--whole-archive会导致许多已被其他库包含或无法解析的符号被包含在内。是否有更精细的方式只包含静态内容? - Gene Vincent
这没有意义 Gene:它与加载共享库相同:您获得整个库,而不会有其他东西。诚然,ld对于查找外部引用的概念弄错了,因此您需要正确安排事情的顺序。 - Yttrill
9
即使您不再需要包含任何库,使用“-Wl,--no-whole-archive”关闭行为实际上也是不可选的。GCC将添加所有标准系统库到您的命令末尾,因此如果您保留“--whole-archive”,它们都会受到影响,这将导致GeneVincent评论中提到的重复符号问题。 - Michael Mrozek
@nos:这是一个很好的答案;但我想知道是否有一些不那么极端的方法;请参考我的这个问题 - einpoklum

2

使用:

g++ -u <SYMBOL_NAME> ...

请注意,-u应该是小写的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接