用于编译我自己的库的递归makefile

时间:2013-08-22 20:27:46

标签: makefile gnu-make

我有一个带有源代码的应用程序目录,并且在同一目录中有另一个带有库的目录。我想用递归编译它。这是一个例子:

我制作了一个虚构的目录树:

> mkdir lib
> touch lib/src1.c
> touch lib/src2.c

然后在主目录中我用代码

创建一个main.c
int main(){return 0;}

和带

的makefile
all: 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来编译可执行文件。

我该如何解决这个问题?

提前谢谢。

1 个答案:

答案 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')。