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

用于编译我自己的库的递归makefile,makefile,gnu-make,Makefile,Gnu Make,我有一个包含源代码的应用程序目录,在同一个目录中还有另一个包含库的目录。我想用递归编译这个。以下是一个例子: 我创建了一个虚构的目录树,如下所示: > mkdir lib > touch lib/src1.c > touch lib/src2.c 然后在主目录中创建一个带有代码的main.c int main(){return 0;} 和一个带有 all: test main.o: lib/libsomelib.a lib/libsomelib.a: lib lib:

我有一个包含源代码的应用程序目录,在同一个目录中还有另一个包含库的目录。我想用递归编译这个。以下是一个例子:

我创建了一个虚构的目录树,如下所示:

> mkdir lib
> touch lib/src1.c
> touch lib/src2.c
然后在主目录中创建一个带有代码的main.c

int main(){return 0;}
和一个带有

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中,但由于在重建库之前检查了库的依赖关系,因此不会更新主应用程序

我需要重新运行make来编译可执行文件

我该如何解决这个问题

提前感谢。

只需更改:

lib:
    make --directory=$@
.PHONY: lib

test: main.o
    cc -L./lib -lsomelib main.o -o $@
致:


请注意,正如Beta版所暗示的那样,它让您以每个目录为基础进行思考,而不是跨越整个目录树,从而切断了make的真正威力。如果你养成了编写归档make文件的习惯,你会发现你的构建不仅更快,而且更可靠(更少需要“make clean&&make”)。

这是递归使用make的一个缺点:它无法正确处理依赖项。您是希望将库的依赖项信息放在主makefile中,还是有时在没有真正理由的情况下重建可执行文件?Beta版,谢谢。可能常见的程序是分别编译我的库和应用程序。但是,由于我正处于开发这两种makefele的阶段,这种makefele将非常有用(更不用说我想学习如何解决这类问题)。您是希望将库的依赖项信息放在主makefile中,还是在没有真正理由的情况下有时重建可执行文件?
lib/libsomelib.a:
    make --directory=$@

test: main.o lib/libsomelib.a
    cc -L./lib -lsomelib main.o -o $@