10

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

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

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

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

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

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

4

1 回答 1

1

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

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

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

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

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

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

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

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

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

于 2017-10-13T16:01:26.407 回答