我有一个带有源代码的应用程序目录,并且在同一目录中有另一个带有库的目录。我想用递归编译它。这是一个例子:
我制作了一个虚构的目录树:
> mkdir lib
> touch lib/src1.c
> touch lib/src2.c
然后在主目录中我用代码
创建一个main.cint main(){return 0;}
和带
的makefileall: test
main.o: lib/libsomelib.a
lib/libsomelib.a: lib
lib:
make --directory=$@
.PHONY: lib
test: main.o
cc -L./lib -lsomelib main.o -o $@
在lib中我创建一个makefile:
all: libsomelib.a
.PHONY: all
libsomelib.a: src1.o src2.o
ar rcs $@ $^
从父目录运行make具有所需的效果。
现在,如果我删除了说lib / src1.o:
rm lib/src1.o
再次运行make,makefile将以递归方式运行到lib中,但由于在重建库之前检查了库的依赖关系,因此主应用程序不会更新。
我需要RERUN make来编译可执行文件。
我该如何解决这个问题?
提前谢谢。
答案 0 :(得分:0)
简单地改变:
lib:
make --directory=$@
.PHONY: lib
test: main.o
cc -L./lib -lsomelib main.o -o $@
为:
lib/libsomelib.a:
make --directory=$@
test: main.o lib/libsomelib.a
cc -L./lib -lsomelib main.o -o $@
请注意,正如Beta所暗示的那样Recursive Make Considered Harmful,因为它会让你在每个目录的基础上思考,而不是在整个树上思考,从而使你脱离make的真正力量。如果你养成了编写heirarchical make文件的习惯,你会发现你的构建不仅更快,而且更可靠(更少需要'make clean&& make')。