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

Gen*_*ent 24 c++ linux gcc static-linking static-initialization

我正在使用可以构建为共享库或静态库的C++库.该库使用工厂技术,其中静态对象在程序启动时自行注册并创建静态对象.

只要使用共享库,这样就可以正常工作.当使用静态版本时,没有任何静态对象被包含在最终程序中(因为它们没有被直接引用),因此它们的功能不可用.

有没有办法强制gcc在链接时包含库中的所有静态对象?

该库是开源的,我可以修改它,如果这有帮助.

nos*_*nos 25

您可以使用-Wl,--whole-archive -lyourlib,请参阅联机帮助页以ld获取更多信息.

在-Wl之后提到的任何静态库, - 命令行上的整个存档都被完全包含在内,如果需要,你可以再次关闭它,例如在 -Wl,--whole-archive -lyourlib -Wl,--no-whole-archive -lotherlib

  • 使用`-Wl关闭行为, - no-whole-archive`实际上不是可选的,即使你没有更多的库可供包含.GCC会将所有标准系统库添加到命令的末尾,所以如果你留下`--whole-archive`,它们都会受到它的影响,它会导致重复符号问题@GeneVincent评论 (8认同)
  • -Wl, - 整个存档会导致包含许多已包含在其他库中的符号或一些无法解析的符号.是否有更细粒度的方式来包含静力学? (5认同)