为什么要两次编译文件

时间:2016-07-14 21:52:39

标签: gnu-make

我有一个makefile

jumbo: objs/jumbo.o  objs/utils.o

objs/%.o: %.C
    $(CXX) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<

编译的结果

g++     jumbo.C objs/jumbo.o objs/utils.o   -o jumbo
objs/jumbo.o:jumbo.C:(.text+0x0): multiple definition of `main'
/tmp/ccwEFt9o.o:jumbo.C:(.text+0x0): first defined here
collect2: error: ld returned 1 exit status
make: *** [<builtin>: server] Error 1

如果我替换jumbo的定义

jumbo: jumbo.C objs/utils.o

问题消失但目标文件没有放在objs目录中

我不知道它是否只是重新编译是否重新编译

1 个答案:

答案 0 :(得分:0)

您尚未定义任何用于构建目标jumbo的配方。因此,make会查找内置规则,并且有一个知道如何从文件X构建文件X.C。查看目录并看看,存在X.Cjumbo.C),因此选择使用该内置规则。内置规则是:

%: %.C
        $(LINK.C) $^ $(LOADLIBES) $(LDLIBS) -o $@

所以,由于jumbo取决于objs/jumbo.objs/utils.o目录以及默认隐式规则中的jumbo.C,因此您可以在命令行中获取所有三个。

要解决此问题,只需定义您自己创建jumbo的方法:

jumbo: objs/jumbo.o  objs/utils.o
        $(LINK.C) $^ $(LOADLIBES) $(LDLIBS) -o $@