【问题标题】:How can I benefit from LTO in my library without requiring it of applications?如何在我的图书馆中受益于 LTO 而无需应用程序?
【发布时间】:2020-09-26 21:26:11
【问题描述】:

我正在开发一个包含大量对象文件的库,这些文件具有相互调用的函数。我希望这些函数受益于 LTO 启用的跨对象文件优化,但不需要使用我的库的应用程序本身与 LTO 链接。

这样的事情可能吗?

我已经将一些函数定义移到了可行的标题中。由于大量使用匿名命名空间和文件范围静态,统一构建会出现问题。

再一次,我的目标是让 LTO 在库创建时发生。当应用程序链接我的库时

我在使用 GCC 的 Linux 上,但我可以使用 clang。

【问题讨论】:

  • 你是做静态库还是动态库?​​
  • 一个静态库。尝试使用共享库会有什么后果?
  • 我不认为静态库可以利用 LTO,因为 LTO(据我了解,我对此并不了解)发生在链接时。静态库更像是目标代码的 ZIP 文件(目标文件 (.o) 的归档 (.a))。共享库是链接的,因此它可能能够利用 LTO。 (对我缺乏 LTO 经验的警告。)
  • 我知道静态库只是一袋目标文件。但是有什么方法可以使用编译器的 LTO 机器来编译每个 .o,就好像每个其他 .o 都可用于内联、常量传播和所有其他优化优点,但不会遇到 ODR 和所有匿名静态内容的问题? LTO 是否有一些基本的东西使这成为不可能,还是没有考虑到这个用例?
  • 除非我弄错了...... LTO 机器可以在链接时间 使用,但静态库的创建是在链接时间之前。为了使 LTO 工作,它必须拥有所有可用的部分才能进行整体优化。创建静态库还没有全部完成。

标签: c++ lto


【解决方案1】:

gcc 选项 -flinker-output=rel[1] 可能会给你想要的东西。您将使用它在您的库上运行链接器,在您的库范围内执行所有 LTO 工作,然后生成一个目标文件。要将其转回静态库,您可以在其上运行 ar [2]。 我自己还没有这样做,我认为unity build 是更好的选择。

  1. https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html
  2. https://www.howtogeek.com/427086/how-to-use-linuxs-ar-command-to-create-static-libraries/

【讨论】:

    【解决方案2】:

    要从理论上实现的静态库 LTO 相同的优化中受益,请为您的库提供 unity build 选项。 这使用了一个源文件,该文件将库中的所有其他代码包含在一个翻译单元中,在该翻译单元中它受到您正在寻找的相同的整个库程序间分析的影响。 SQLite 是使用这种方法的一个广泛使用的库的示例,甚至将其自身作为单个源文件分发,这是所有这些传递包含预处理到SQLite Amalgamation 的结果。现代 CMake supports unity builds.

    【讨论】:

    • 感谢您的回答。我所有定义具有通用名称的符号的匿名命名空间会发生什么?
    • 它们都需要修改以具有唯一的名称。抱歉,我的回答忽略了您问题中提出的这个问题。
    猜你喜欢
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多