可能是一个简单的答案;对于其中一些标志,我对GCC文档中使用的语言感到很困惑!
无论如何,我有三个库和一个使用这三个的程序。我用各个(可能)不同的警告标志集分别编译我的每个库。但是,我使用相同的优化标志集编译所有三个库。
然后我在这三个库中编译我的主程序,使用它自己的一组警告标志和库编译时使用的相同优化标志。
1)我是否必须使用优化标志编译库,或者在编译最终程序并链接到库时是否可以使用这些标志?如果是后者,那么它会优化这些库中的所有代码还是仅仅代表某些代码(可能是所谓的代码)?
2)我想使用-fwhole-program -flto -fuse-linker-plugin和链接器插件gold。我在哪个阶段编译这些...只是最后的编译或者在编译库时是否需要出现这些标志?
3)与2)几乎相同,但是-fprofile-generate -fprofile-arcs和-fprofile-use。我理解首先运行一个带有generate的程序,然后使用。但是,我是否必须使用generate / use等编译每个库或仅使用最终程序?如果它只是最后一个程序,那么当我使用-fprofile-use进行编译时,它还会优化库的功能吗?
答案 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.相同。需要为每个源代码文件指定这些标志,以便优化所有代码。
请注意,如果您没有源代码,您仍然可以链接未使用相同标志优化的静态或动态库,并且代码可以正常工作。也就是说,您可以混合在不同级别优化的代码。