我的目录结构为 src / obj / include / bin / 我在 src 文件夹中创建了2个 .cpp 文件 include 文件夹中的cpp文件使用的头文件。我想在 obj 文件夹中创建目标文件,在 bin 文件夹中创建二进制文件:
vpath %.cpp src
vpath %.h include
vpath %.o obj
all : main.o factorial.o run
run : main.o factorial.o
cc $^ -o bin/$@ -lstdc++
main.o : main.cpp functions.h
cc -c $< $(inc) -o obj/$@ -lstdc++
factorial.o : factorial.cpp functions.h
cc -c $< $(inc) -o obj/$@ -lstdc++
clean :
rm -rf bin/* obj/*
并且在第一次关注时输出:
betatest@dragon make-tut]$ make
cc -c src/main.cpp -I include -o obj/main.o -lstdc++
cc -c src/factorial.cpp -I include -o obj/factorial.o -lstdc++
cc main.o factorial.o -o bin/run -lstdc++
cc: main.o: No such file or directory
cc: factorial.o: No such file or directory
make: *** [run] Error 1
betatest@dragon make-tut]$
如果我再次运行make,则没有错误:
[betatest@dragon make-tut]$ make
cc obj/main.o obj/factorial.o -o bin/run -lstdc++
有什么问题?
答案 0 :(得分:1)
makefile的第一条规则。目标需要使用目标的完全名称创建文件。
因此,在目录中生成文件但目标名称中不包含该目录的所有规则(例如main.o : main.cpp functions.h ; cc -c $< $(inc) -o obj/$@ -lstdc++
)都不正确。
这会导致第一次运行中的问题,因为make认为它已创建factorial.o
和main.o
,但实际上已创建obj/factorial.o
和obj/main.o
。
第二次运行您编写的vpath
指令正在运行并正确查找裸obj/factorial.o
和obj/main.o
下的factorial.o
和main.o
个对象名。