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

Posted

技术标签:

【中文标题】Makefile 包含来自其他目录的头文件【英文标题】:Makefile include header file from other directory 【发布时间】:2015-01-15 15:31:52 【问题描述】:

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

   subdir-test

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

以下是制作文件: 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循环如下:

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

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

【问题讨论】:

如果您的 make 文件未命名为 makefileMakefile(或者可能是其他混合大小写的变体,取决于您的 make 版本),那么您还必须告诉 make 哪个要使用的文件 - 比如make -C src -f Makefile2... 不是那个问题,但问题是头文件在包含文件夹中,它没有被包含在 src 文件夹 Makefile2 中,所以我认为我在“inc”变量使用方面是错误的。请提出解决方案如何包含包含文件夹中的头文件。 【参考方案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 -> ../bin/ 类似跑。 我认为在这种情况下使用三个不同的 makefile 并不会带来太多好处,但这取决于你。

【讨论】:

如果您点击接受答案按钮,那么您的声誉将会增加。

以上是关于Makefile 包含来自其他目录的头文件的主要内容,如果未能解决你的问题,请参考以下文章

如何让 Makefile 自动重建包含修改后的头文件的源文件? (在 C/C++ 中)

包括来自另一个目录的头文件

如何在不扩展包含的头文件的情况下预编译 C 源文件?

Makefile中自动生成头文件依赖

如何快速搜索项目中所有包含的头文件以查找特定符号?

如何使用 makefile 生成自动头文件