在c ++中使用-o和-c的Makefile语法

时间:2014-07-28 01:22:01

标签: c++ makefile

自从我做了一个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文件(并且它们在那里)

2 个答案:

答案 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