找不到对象错误

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.omain.o 但实际上它已经创建了 obj/factorial.oobj/main.o .

第二个 运行 您编写的 vpath 指令正在发挥作用,make 正确地找到了 factorial.o 下的 obj/factorial.oobj/main.o 对象和 main.o 个名字。