2016-07-14 44 views
0

我有一个makefile为什么编译文件两次

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

objs/%.o: %.C 
    $(CXX) $(CFLAGS) $(CPPFLAGS) -c -o [email protected] $< 

编译

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.C objs/utils.o 

定义问题消失但目标文件不会被放在objs目录中

我不知道它是否重新编译巨大时,它应该只是重新连接

回答

0

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

%: %.C 
     $(LINK.C) $^ $(LOADLIBES) $(LDLIBS) -o [email protected] 

如此,因为jumbo取决于objs/jumbo.objs/utils.o目录加上从默认隐含规则的jumbo.C,你在命令行上的所有三个。

为了解决这个问题只需定义自己的食谱创建jumbo

jumbo: objs/jumbo.o objs/utils.o 
     $(LINK.C) $^ $(LOADLIBES) $(LDLIBS) -o [email protected]