Makefile 包含来自其他目录的头文件

Makefile include header file from other directory

我有一个 drectiry 子目录测试,其中包含子目录 obj bin src。我有 3 个 makefile,一个在 src 中,一个在 obj 中,一个在子测试中。 我想在其中使用递归 make,但我有一个错误。 目录结构为:

   subdir-test

      - Makefile1
      - src
           - all.c files and Makefile2
      - obj
           - all.o files and Makefile3
      - include
           - functions.h
      - bin

下面是制作文件: 生成文件 1:

   SUBDIRS = src obj

   subdirs : 
         for dir in $(SUBDIRS);\
         do \
         $(MAKE) -C $$dir ;\
         done

  .PHONY : clean

  clean : 
         rm -rf bin/* obj/*

生成文件 2:

   inc = -I ../include/ 

   all : main.o factorial.o 

   main.o : main.cpp functions.h 
       cc -c $< -I $(inc) -o ../obj/$@ -lstdc++

  factorial.o : factorial.cpp functions.h
      cc -c $< -I $(inc) -o ../obj/$@ -lstdc++

生成文件 3:

 run : main.o factorial.o
      cc $^ -o ../bin/$@

从子测试目录调用 make -f Makefile1 时出现以下错误:

  for dir in src obj;\
    do \
    make -C $dir ;\
   done
make[1]: Entering directory `/home/betatest/Public/subdir-test/src'
make[1]: *** No rule to make target `functions.h', needed by `main.o'.  Stop.
make[1]: Leaving directory `/home/betatest/Public/subdir-test/src'
make[1]: Entering directory `/home/betatest/Public/subdir-test/obj'
make[1]: *** No rule to make target `main.o', needed by `run'.  Stop.
make[1]: Leaving directory `/home/betatest/Public/subdir-test/obj'
make: *** [subdirs] Error 2

我还有一个问题,因为我想按如下方式编写 for 循环:

  for dir in $(SUBDIRS)
  do
    $(MAKE) -C $$dir
  done

我在 for 循环中也遇到了错误。我哪里错了。

使用这样编写的 makefile,我相信使用依赖项的相对路径将解决您的问题。您可以保留 Makefile1 的原样,因为您正在以正确的顺序处理目录。

Makefile2 将变为:

   inc = -I ../include/ 

   all : main.o factorial.o 

   main.o : main.cpp ../include/functions.h 
       cc -c $< -I $(inc) -o ../obj/$@ -lstdc++

   factorial.o : factorial.cpp ../include/functions.h
      cc -c $< -I $(inc) -o ../obj/$@ -lstdc++

makefile3 可能会保持不变,因为 main.o 和 factorial.o 不存在于 obj/ 中只是因为 makefile2 中的错误。

请注意,目前 main.o 和 factorial.o 将始终被编译(并且可能会与 .PHONY 一起编译),因为目标实际上是 ../obj/main.o,与 运行 -> ../bin/run。 我认为在这种情况下使用三个不同的 makefile 不会给您带来太多好处,但这取决于您。