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 文件未命名为makefile
或 Makefile
(或者可能是其他混合大小写的变体,取决于您的 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 包含来自其他目录的头文件的主要内容,如果未能解决你的问题,请参考以下文章