找不到对象错误

时间:2015-01-06 12:39:29

标签: makefile gnu-make

我的目录结构为 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++ 

有什么问题?

1 个答案:

答案 0 :(得分:1)

makefile的第一条规则。目标需要使用目标的完全名称创建文件。

因此,在目录中生成文件但目标名称中不包含该目录的所有规则(例如main.o : main.cpp functions.h ; cc -c $< $(inc) -o obj/$@ -lstdc++)都不正确。

这会导致第一次运行中的问题,因为make认为它已创建factorial.omain.o,但实际上已创建obj/factorial.oobj/main.o

第二次运行您编写的vpath指令正在运行并正确查找裸obj/factorial.oobj/main.o下的factorial.omain.o个对象名。