我有一个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循环中也遇到错误。我哪里出错了。
答案 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获得了很多,但这取决于你。