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

问题描述 投票:0回答:1

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

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

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

以标志

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

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

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

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

g++ flags
1个回答
0
投票

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

编译。

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

是的。

预处理也可能受到影响,例如通过定义诸如

NDEBUG
_GLIBCXX_DEBUG
之类的宏,但单独进行预处理并不常见:大多数 makefile 都会调用编译器将源文件直接转换为目标文件,因此编译器在以下位置执行预处理、编译和汇编:一步到位。

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

RTFM,当然!

选项摘要列出了所有选项,并将它们分组为几个部分。

很明显,这些选项控制特定阶段:

控制预处理器的选项
将选项传递给汇编器
链接选项

还有目录搜索选项,其中头文件搜索路径由预处理器使用,库搜索路径由链接器使用。

通常所有其他选项控制编译,或应用于所有阶段(例如

-o
设置输出文件名)或指定

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

是的。

GNU 链接器还有一个

-O
标志,请参阅 ld 手册,但目前仅在链接 ELF 共享库时有效,并且 GCC 不会使用它,除非您明确请求,例如通过
-Wl,-O

© www.soinside.com 2019 - 2024. All rights reserved.