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 不会给您带来太多好处,但这取决于您。
我有一个 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 不会给您带来太多好处,但这取决于您。