我有一个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目录中
我不知道它是否只是重新编译是否重新编译
答案 0 :(得分:0)
您尚未定义任何用于构建目标jumbo
的配方。因此,make会查找内置规则,并且有一个知道如何从文件X
构建文件X.C
。查看目录并看看,存在X.C
(jumbo.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 $@