应该将哪些标志应用于哪个编译阶段?

时间:2012-08-14 01:27:34

标签: compiler-construction g++ flags

我想确保我正确理解g ++文档。

通过G ++使用C / C ++程序时,我们通常会进行预处理,编译,汇编和链接。

根据您是在构建代码的调试版本还是发布版本,您可以选择对最终产品应用不同的标志。

以旗帜-O3为例。该标志应适用于哪个阶段?我认为在编译期间生成.o文件时应该应用这个。 (这是文档中的某个地方吗?

如果是这样,如果想要生成2个版本的程序,一个用于发布,一个用于调试,.o应该作为make文件的一部分单独生成(这是正确的吗?) < / p>

一般来说,G ++帮助很广泛,如何找出应该给定标志应用于哪个过程的部分?

当我们谈论优化时,我们是在谈论目标代码吗?

1 个答案:

答案 0 :(得分:0)

  

以标志-O3为例。该标志应适用于哪个阶段?

编制。

  

如果想要生成2个版本的程序,一个用于发布,一个用于调试,.o应该作为make文件的一部分单独生成

预处理也可能受到影响,例如通过NDEBUG_GLIBCXX_DEBUG之类的宏的定义,但是不管怎么说分别进行预处理并不常见:大多数makefile调用编译器直接将源文件转换为目标文件,因此编译器执行预处理,一步编译和组装。

  

一般来说,G ++帮助很广泛,如何找出应该给定标志应用于哪个过程部分?

RTFM,当然!

Option Summary列出所有选项,将它们分组到各个部分。

显然,这些选项可以控制特定的阶段:

Options Controlling the Preprocessor
Passing Options to the Assembler
Options for Linking

还有Options for Directory Search,其中预处理器使用头文件搜索路径,链接器使用库搜索路径。

通常所有其他选项控制编译,或应用于所有阶段(例如-o来设置输出文件名),或指定

  

当我们谈论优化时,我们是在谈论目标代码吗?

GNU链接器还有一个-O标志,请参阅the ld manual,但目前只有在链接ELF共享库时才有效,GCC不会使用它,除非您明确请求它,例如通过-Wl,-O