何时使用某些优化,如-fwhole-program和-fprofile-generate,与多个共享库一起使用?

10
1) 我们需要在编译库时使用优化标志,然后在编译主程序时链接到这些库,并再次使用相同的优化标志。这将确保库中的所有代码都被优化。 2) -fwhole-program、-flto、-fuse-linker-plugin 和链接器插件 gold 应该在最终编译阶段使用。 3) 我们只需要在最后一个程序中使用 -fprofile-generate、-fprofile-arcs 和 -fprofile-use 标志,编译库时不需要使用它们。当我们使用 -fprofile-use 时,它也会优化库的功能。
1个回答

1

我会将这三个库与主程序链接,使用相同的优化标志和编译库期间使用的警告标志来编译主程序。

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

1)我必须使用优化标志编译库,还是只需在编译最终程序并链接到库时使用这些标志即可?如果是后者,它是否会优化这些库中的所有代码(假定调用的部分)还是仅优化其中一部分?

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

2)我想使用-fwhole-program -flto -fuse-linker-plugin和链接器插件gold。在哪个阶段应该使用这些标志...只是最终编译还是这些标志需要在编译库时出现?

当编译每个源代码文件(或可用的源代码文件)时,您必须指定-flto。如果使用gold链接器或GNU ld 2.21或更新版本,则不需要指定-fuse-linker-plugin-fwhole-program。有关更多信息,请参见-flto文档

3) 几乎与第2种情况相同,但是使用了-fprofile-generate、-fprofile-arcs和-fprofile-use。我理解首先要使用generate运行程序,然后再使用use。但是,我是否需要为每个库编译生成/使用等等,还是只需为最终程序编译?如果只是最后一个程序,那么当我使用-fprofile-use编译时,它是否也会优化库的功能?

与第2种情况相同。这些标志需要针对每个源代码文件进行指定,以便优化所有代码。
请注意,如果您没有源代码,仍然可以链接未使用相同标志进行优化的静态或动态库,代码将正常工作。也就是说,您可以混合使用不同级别的优化代码。

1
此外,请注意 -flto 不会与您链接的共享库进行交互。您可以在构建共享库本身时执行链接时间优化,以便在构建时从 flto 中受益,但是链接到该共享库的自己的可执行文件无法在可执行文件和链接到的共享库之间执行链接时间优化。(但是您可以使用静态库实现) - nos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接