何时对多个共享库使用某些优化,例如 -fwhole-program 和 -fprofile-generate

Posted

技术标签:

【中文标题】何时对多个共享库使用某些优化,例如 -fwhole-program 和 -fprofile-generate【英文标题】:When to use certain optimizations such as -fwhole-program and -fprofile-generate with several shared libraries 【发布时间】:2012-12-02 23:00:48 【问题描述】:

可能是一个简单的答案;我对 GCC 文档中用于其中一些标志的语言感到非常困惑!

无论如何,我有三个库和一个使用这三个库的程序。我使用单独的(可能)不同的警告标志集分别编译我的每个库。但是,我使用相同的优化标志集编译所有三个库。

然后,我使用自己的一组警告标志和在库编译期间使用的相同优化标志来编译我在这三个库中链接的主程序。

1) 在编译最终程序并链接到库时,我是否必须编译带有优化标志的库,或者我可以只使用这些标志吗?如果是后者,它会优化这些库中的全部还是部分(大概是被调用的)代码?

2) 我想使用 -fwhole-program -flto -fuse-linker-plugin 和链接器插件黄金。我应该在哪个阶段使用这些进行编译...只是最终编译还是在库编译期间需要存在这些标志?

3) 与 2) 几乎相同,但是使用 -fprofile-generate -fprofile-arcs 和 -fprofile-use。我知道一个人首先使用生成运行程序,然后使用。但是,我必须使用生成/使用等编译每个库还是只编译最终程序?如果它只是最后一个程序,那么当我使用 -fprofile-use 进行编译时,它还会优化库功能吗?

【问题讨论】:

【参考方案1】:

然后我在这三个库中编译我的主程序链接 它自己的一组警告标志和使用的相同优化标志 在库编译期间。

这里有两个步骤,而不是一个。编译主程序生成目标文件是第一步,然后将所有内容链接在一起生成可执行二进制文件是第二步。

1) 我是否必须编译带有优化标志的库 或者我可以在编译最终程序时使用这些标志吗? 链接到图书馆?如果是后者,它会优化所有还是 只是这些中的一些(大概是所谓的)代码 图书馆?

必须为每个源代码文件指定优化标志和任何其他编译器级别的标志。每次编译源文件以生成目标文件时,都需要指定标志。然后生成库或可执行文件由链接器使用不同的链接器标志集完成。

2) 我想使用 -fwhole-program -flto -fuse-linker-plugin 和 链接器插件黄金。我在哪个阶段编译这些... 只是最终编译或这些标志是否需要在 库的编译?

您必须在编译每个源代码文件(或您可用的源代码文件)时指定-flto。使用黄金链接器或 GNU ld 2.21 或更高版本时,您无需指定 -fuse-linker-plugin-fwhole-program。有关详细信息,请参阅 -flto 上的 documentation。

3) 与 2) 几乎相同,但是使用 -fprofile-generate -fprofile-arcs 和 -fprofile-use。我知道一个人首先使用生成运行程序,然后使用。但是,我必须 使用生成/使用等编译每个库,或者只是最终的 程序?如果它只是最后一个程序,那么当我编译时 使用 -fprofile-use 是否还会优化库功能?

同 2。需要为每个源代码文件指定这些标志,以便优化所有代码。

请注意,如果您没有源代码,您仍然可以链接未使用相同标志优化的静态或动态库,并且代码将正常工作。也就是说,您可以混合在不同级别优化的代码。

【讨论】:

除此之外 - 请注意 -flto 不与您链接到的共享库交互您可以在构建共享库本身时执行链接时间优化,以便在构建共享库时受益于 flto ,但是链接到该共享库的您自己的可执行文件无法跨可执行文件及其链接到的共享库执行链接时间优化。 (但你可以使用静态库)

以上是关于何时对多个共享库使用某些优化,例如 -fwhole-program 和 -fprofile-generate的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中创建 Windows 共享库时如何实现接口隔离

webpack用法总结---性能优化

:构建WineLib DLL

单个源代码与多个文件 + 库

优化编译器如何决定何时展开循环以及展开循环的程度?

如何在运行时确定共享库中全局变量的地址范围?