自从我做了一个makefile以来已经有一段时间了。我继承了一些在makefile中使用以下行构建的代码
$(CC) $(FLAGS) -c -o $*.o $*.cpp
为什么要在同一行中使用-c
和-o
。 -c
不能使你在没有链接的情况下构建对象吗?
编辑以下是完整的makefile,现在我收到错误cpp.cpp No such file or directory
.SUFFIXES: .o .cpp
CC=g++
MAIN_OBJS = \
main.o \
f1.o \
f2.o \
all:
$(CC) -c -o $*.o $*.cpp
$(CC) $(MAIN_OBJS) -o final
$*.cpp
不应该找到当前路径中的所有.cpp文件(并且它们在那里)
答案 0 :(得分:2)
正如你所说,-c
意味着制作没有链接的对象文件。
-o
表示您要覆盖默认输出文件名并指定自己的名称。所以-o $.o
表示输出文件名与输入文件名相同,但最后使用.o。
如果您计划将此Makefile规则用于许多不同的编译器,可能会执行此操作,其中一些编译器可能具有不同的目标文件的默认输出文件名。
gcc的手册页描述-o
,如下所示:
-o file
将输出放在文件文件中。 这适用于无论生成什么类型的输出,无论它是可执行文件,还是 目标文件,汇编程序文件或预处理的C代码。如果-o不是 指定,默认是将可执行文件放在a.out中 source.o中source.suffix的目标文件,其汇编文件在 source.s,source.suffix.gch中的预编译头文件,以及所有 在标准输出上预处理C源。
答案 1 :(得分:0)
是的,你所说的是有道理的 我们知道, -c 将编译源文件并生成汇编文件 之后,我们通常使用 -o 链接所有这些程序集文件并生成可执行文件 以下是-o是输出可执行文件的名称。
如果 -c 和 -o 在同一行中使用,则表示 -c 生成的输出程序集文件为命名为 -o 。