什么时候应该在 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 选项?的主要内容,如果未能解决你的问题,请参考以下文章
make: *** 没有指明目标并且找不到 makefile。 停止