什么时候应该在 Makefile 中使用 -c 或 -o GCC 选项?

Posted

技术标签:

【中文标题】什么时候应该在 Makefile 中使用 -c 或 -o GCC 选项?【英文标题】:When should -c or -o GCC options be used in a Makefile? 【发布时间】:2015-09-29 17:00:47 【问题描述】:

我正在使用 Makefile 来编译我的 cpp 文件和头文件。但是我不完全理解的是编译时 -o 和 -c 之间的区别。 我知道 -o 创建一个目标文件,通常我们写 “g++ -o 编译 demo.cpp” 编译程序demo.cpp。 但是当编译一个有很多类的程序时,我们为什么要使用 “g++ -c 类.cpp” 而不是 -o 像我们通常做的那样。这是一个示例 Makefile。非常感谢您帮助我!

all:compile

compile: demo.cpp class.o
    g++ -o compile demo.cpp class.o
class.o: class.h class.cpp
    g++ -c class.cpp

【问题讨论】:

-o 仅表示output name-c 表示 compile only, don't link。您的示例的更完整(非默认)版本可能会显示 g++ -c class.cpp -o class.o 首先检查文档gcc.gnu.org/onlinedocs/gcc/Overall-Options.html 【参考方案1】:

"...我们为什么要使用g++ -c class.cpp..."

来自GCC's documentation(强调我的):

-c 编译或汇编源文件,但不要链接。链接阶段根本没有完成。最终输出是每个源文件的目标文件的形式。 默认情况下,源文件的目标文件名是通过将后缀“.c”、“.i”、“.s”等替换为“.o”。

不需要编译或汇编的无法识别的输入文件将被忽略。

-o 文件 将输出放在文件文件中。这适用于正在生成的任何类型的输出,无论是可执行文件、目标文件、汇编文件还是预处理的 C 代码。 如果没有指定-o,默认是在a.out中放一个可执行文件,在source.o中source.suffix的目标文件,在source.s中它的汇编文件,在source.suffix.gch中的一个预编译头文件,以及标准输出上的所有预处理 C 源代码。

-c 用于确保将class.o 编译为目标文件,该目标文件可以从稍后应用的compile 目标规则链接。

由于所需的compile 目标是可执行文件,因此使用-o 来确保完成链接。

【讨论】:

非常感谢!很好的解释

以上是关于什么时候应该在 Makefile 中使用 -c 或 -o GCC 选项?的主要内容,如果未能解决你的问题,请参考以下文章

我啥时候应该在 PL/SQL 中使用过程或函数?

make: *** 没有指明目标并且找不到 makefile。 停止

我们啥时候应该在布局中使用 dp 或 sp?

什么时候应该使用交换或重置

什么时候应该在 Flash 中使用 CPU 或 GPU 编译器选项?

makefile能不能接受输入参数