【问题标题】:How to force gcc to link unreferenced, static C++ objects from a library如何强制 gcc 从库中链接未引用的静态 C++ 对象
【发布时间】:2011-06-13 16:00:25
【问题描述】:

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

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

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

该库是开源的,如果有帮助,我可以对其进行修改。

【问题讨论】:

    标签: c++ linux gcc static-linking static-initialization


    【解决方案1】:

    您可以使用 -Wl,--whole-archive -lyourlib ,有关更多信息,请参阅 ld 的手册页。

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

    【讨论】:

    • -Wl,--whole-archive 导致包含很多符号,这些符号已经被其他库包含或一些无法解析的符号。有没有更细粒度的方法来包含静态?
    • 这没有意义 Gene:它与加载共享库相同:您得到整个库,仅此而已。诚然 ld 有一个错误的查找外部引用的概念,所以你需要把事情的顺序弄好。
    • 使用-Wl,--no-whole-archive 关闭行为实际上不是可选的,即使您没有更多要包含的库。 GCC 会将所有标准系统库添加到命令的末尾,因此如果您将 --whole-archive 保留在上面,它们都会受到它的影响,并且会导致重复符号问题 @GeneVincent 评论过
    • @nos:这是一个很好的答案;但我想知道是否有一些不那么极端的东西;见我的this question
    【解决方案2】:

    用途:

    g++ -u <SYMBOL_NAME> ...
    

    注意-u是小写

    【讨论】:

      猜你喜欢
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多