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

时间:2015-01-15 15:31:52

标签: makefile gnu-make

我有一个drectiry subdir-test,子目录obj bin src包含在其中。我有一个makefile在src中有一个在obj中,一个在sub-test中。我想在那里使用递归make但是我有一个错误。      目录结构是:

   subdir-test

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

以下是make文件: Makefile1:

   SUBDIRS = src obj

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

  .PHONY : clean

  clean : 
         rm -rf bin/* obj/*

Makefile2:

   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++

Makefile3:

 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 dir in $(SUBDIRS)
  do
    $(MAKE) -C $$dir
  done

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

1 个答案:

答案 0 :(得分:1)

使用这样编写的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,类似于run - &gt; ../bin/run。 在这种情况下,我不认为你通过使用三种不同的makefile获得了很多,但这取决于你。