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

时间:2012-12-02 23:00:49

标签: gcc compiler-optimization compiler-flags

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

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

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

1)我是否必须使用优化标志编译库,或者在编译最终程序并链接到库时是否可以使用这些标志?如果是后者,那么它会优化这些库中的所有代码还是仅仅代表某些代码(可能是所谓的代码)?

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

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

1 个答案:

答案 0 :(得分: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。我理解首先运行一个带有generate的程序,然后使用。但是,我必须这样做   使用generate / use等编译每个库或者只是最终编译   程序?如果它只是最后一个程序,那么我然后编译   使用-fprofile-use还会优化库的功能吗?

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

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