找不到对象错误
Object not found error make
我的目录结构为 src/obj/include/bin/ 我在 .cpp 中创建了 2 个 .cpp 文件=]src 文件夹和 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 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/*
lt; $(inc) -o obj/$@ -lstdc++
factorial.o : factorial.cpp functions.h
cc -c 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/*
lt; $(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++
问题是什么?
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
指令正在发挥作用,make 正确地找到了 factorial.o
下的 obj/factorial.o
和 obj/main.o
对象和 main.o
个名字。
我的目录结构为 src/obj/include/bin/ 我在 .cpp 中创建了 2 个 .cpp 文件=]src 文件夹和 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 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/*
lt; $(inc) -o obj/$@ -lstdc++
factorial.o : factorial.cpp functions.h
cc -c 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/*
lt; $(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++
问题是什么?
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
指令正在发挥作用,make 正确地找到了 factorial.o
下的 obj/factorial.o
和 obj/main.o
对象和 main.o
个名字。