【发布时间】:2012-04-24 14:10:23
【问题描述】:
为了简单起见,假设我有以下文件夹:
-
./src/有很多 .c 文件 -
./obj/带有许多 .obj 文件 -
./output/我要构建的二进制文件
我的makefile如下:
all: init mybin
# init commands
init:
mkdir obj
mkdir output
mybin: project1 project2 project3
$(CC) src/misc.c ... etc
$(LK) obj/first.obj obj/second.obj obj/third.obj obj/four.obj obj/five.obj obj/six.obj obj/seven.obj obj/eight.obj obj/nine.obj -o output/myapp.bin
project1: obj/first.obj obj/second.obj obj/third.obj
obj/first.obj: src/first.c
$(CC) first.c ... etc
obj/second.obj: src/second.c
$(CC) obj/second.c ... etc
obj/third.obj: src/third.c
$(CC) obj/third.c ... etc
project2: obj/four.obj obj/five.obj obj/six.obj
obj/four.obj: src/four.c
$(CC) four.c ... etc
obj/five.obj: src/five.c
$(CC) obj/five.c ... etc
obj/six.obj: src/six.c
$(CC) obj/six.c ... etc
project3: obj/seven.obj obj/eight.obj obj/nine.obj
obj/seven.obj: src/seven.c
$(CC) seven.c ... etc
obj/eight.obj: src/eight.c
$(CC) obj/eight.c ... etc
obj/nine.obj: src/nine.c
$(CC) obj/nine.c ... etc
我第一次运行make all,所有编译的东西都找到了。然后我做了:
$ touch src/four.c
$ make all
$
但是make 没有编译任何东西就退出了。我猜它没有检测到其中一个 .c 文件已更改,但是我看不出我的依赖项有什么问题。
我所期望的:touching src/four.c 应该标记为 obj/four.obj 已过时,project2 也应标记为已过时,因此也将 mybin 标记为已过时。这个链应该会触发src/four.c 到obj/four.obj 的新编译,然后是整个项目的新链接。
【问题讨论】:
-
运行 make -d all 看看有什么过时的
-
它尝试了很多没有意义的“隐含先决条件”。我正在尝试构建一个名为
FW.mot的文件,make试图找到不存在的FW.mot.c或FW.mot.cc或FW.mot.F!!! -
好吧,grep 相关文件,如果它说 FW.mot 是最新的,然后检查所有依赖项,如果应该触发重建的那个不存在,那么你没有列出它在 Makefile 中
标签: gnu-make