0

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

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

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

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

我该如何解决?

先感谢您。

4

1 回答 1

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 的真正力量。如果您养成编写分层 make 文件的习惯,您会发现您的构建不仅更快,而且更可靠(更少需要'make clean && make')。

于 2014-02-02T00:56:15.190 回答