Jam*_*mes 10 gcc compiler-flags compiler-optimization
可能是一个简单的答案; 对于其中一些标志,我对GCC文档中使用的语言感到很困惑!
无论如何,我有三个库和一个使用这三个的程序.我用各个(可能)不同的警告标志集分别编译我的每个库.但是,我使用相同的优化标志集编译所有三个库.
然后我编译我的主程序链接在这三个库中,它们有自己的一组警告标志和库编译时使用的相同优化标志.
1)我是否必须使用优化标志编译库,或者我可以在编译最终程序并链接到库时使用这些标志?如果是后者,那么它会优化这些库中的所有代码还是仅仅代表某些代码(可能是所谓的代码)?
2)我想使用-fwhole-program -flto -fuse-linker-plugin和链接器插件gold.我在哪个阶段编译这些......只是最后的编译或者在编译库时是否需要存在这些标志?
3)与2)几乎相同,但是-fprofile-generate -fprofile-arcs和-fprofile-use.我理解首先运行一个带有generate的程序,然后使用.但是,我是否必须使用generate/use等编译每个库或仅使用最终程序?如果它只是最后一个程序,那么当我使用-fprofile-use进行编译时,它是否还会优化库功能?
然后,我编译主程序,链接到这三个库,并使用其自己的一组警告标志以及库编译期间使用的相同优化标志。
这里有两个步骤,而不是一个。第一步是编译主程序以生成目标文件,然后第二步将所有内容链接在一起以生成可执行二进制文件。
1)我是否必须编译带有优化标志的库,或者我可以在编译最终程序并链接到库时使用这些标志吗?如果是后者,它会优化这些库中的全部或部分代码(大概是被调用的代码)吗?
必须为每个源代码文件指定优化标志和任何其他编译器级标志。每次编译源文件以生成目标文件时,您都需要指定标志。然后,链接器使用链接器的不同标志集来生成库或可执行文件。
2)我想使用 -fwhole-program -flto -fuse-linker-plugin 和链接器插件 gold。我在哪个阶段使用这些进行编译...只是最终编译,还是在库编译期间需要存在这些标志?
您必须-flto在编译每个源代码文件(或您可用的源代码文件)时指定。使用 gold 链接器或 GNU ld 2.21 或更高版本时,不需要指定-fuse-linker-pluginand 。-fwhole-program有关更多信息,请参阅上的文档-flto。
3) 与 2) 几乎相同,但是使用 -fprofile-generate -fprofile-arcs 和 -fprofile-use。我知道首先使用“生成”运行程序,然后使用“使用”运行程序。但是,我是否必须使用生成/使用等来编译每个库,或者只是最终的程序?如果它只是最后一个程序,那么当我使用 -fprofile-use 进行编译时,它还会优化库功能吗?
与 2 相同。需要为每个源代码文件指定这些标志,以便优化所有代码。
请注意,如果您没有源代码,您仍然可以链接未使用相同标志优化的静态或动态库,并且代码将起作用。也就是说,您可以混合在不同级别优化的代码。