微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在不需要应用程序的情况下,如何从我的库中的LTO中受益?

如何解决在不需要应用程序的情况下,如何从我的库中的LTO中受益?

我正在开发一个包含许多目标文件的库,这些目标文件具有相互调用功能。我希望这些功能可以从LTO启用的跨对象文件优化中受益,但不需要使用我的库的应用程序自己与LTO链接

这可能吗?

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

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

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

解决方法

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/
,

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。