【问题标题】:When should -c or -o GCC options be used in a Makefile?什么时候应该在 Makefile 中使用 -c 或 -o GCC 选项?
【发布时间】: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

【问题讨论】:

标签: c++ gcc makefile


【解决方案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 来确保完成链接。

【讨论】:

  • 非常感谢!很好的解释
猜你喜欢
  • 2011-01-26
  • 2010-12-03
  • 2010-12-30
  • 2010-10-18
  • 1970-01-01
  • 2011-06-16
  • 1970-01-01
  • 2011-07-11
相关资源
最近更新 更多