【问题标题】:Unnecessary linked libraries in linker链接器中不必要的链接库
【发布时间】:2011-01-09 13:29:53
【问题描述】:

我有一个项目,我可以从链接器中排除一些库并仍然构建?

在最终产品的性能和内存方面排除它们会更好吗?

【问题讨论】:

    标签: c++ linker


    【解决方案1】:

    一个好的 c++ 链接器不会包含来自代码中未使用的任何库的任何调用(所谓的“死代码剥离”)。

    所以,我想说这取决于您使用哪种 C++ 链接器来发出最终版本。也许您应该参考您的链接器文档以获取有关死代码剥离的信息。如果它不这样做,那么它肯定有助于减少程序的最终内存占用。

    干杯,希望信息有所帮助!

    【讨论】:

      【解决方案2】:

      从最终的可执行文件中排除一些未使用的库可能会加快启动速度并节省微小的内存量 - 可能只有标头和库启动代码实际上最终会被加载,而这些启动后可以分页。

      但是,不要手动操作。如果您被告知要添加库,则可能是有原因的 - 也许您没有使用的某些函数调用尚未需要它,稍后如果您使用该函数调用,您可能已经忘记了它.

      大多数链接器都有一个自动排除未使用库的选项,因此您可能只想启用该选项以让它为您处理事情。

      注意:在极少数情况下,库的启动代码可能会产生一些重要影响,在这种情况下您不应排除它。这最好通过检查图书馆的文档来确定;像这样的事情应该(希望!)清楚地记录在案。

      【讨论】:

        【解决方案3】:

        应该没什么区别。

        任何价值的链接器都不会包含应用程序未(直接或间接)引用的库中的任何内容,即使这些库是在命令行中指定的。
        包含(一部分)库的唯一原因是: - 应用程序使用库中的函数或全局对象 - 为解析某些引用而包含的库的一部分具有对该库的函数或全局对象的引用。

        链接器不仅会盲目地将您提供的所有内容放在应用程序中,而且还会区分目标文件(针对应用程序)和库。
        链接器首先收集所有目标文件并解析文件之间的尽可能多的引用。
        之后,链接器会遍历指定的库并从每个库中获取解析(已知)未解析引用所需的部分。由于库之间的依赖关系,这可能会创建新的未解析引用。大多数链接器只会对库进行一次传递,但有些链接器可能会执行多次传递来解析所有引用。 解析引用不需要的部分库不包含在可执行文件中。

        【讨论】:

        • 我认为这充其量是一种误导,而且根据我使用 GNU 交叉编译工具链的经验,它是不正确的。
        【解决方案4】:

        是的,排除不必要的库总是更好。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-09-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-25
          相关资源
          最近更新 更多