【发布时间】: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 工作,它必须拥有所有可用的部分才能进行整体优化。创建静态库还没有全部完成。