我正在拔头发试图调试 make 的问题。似乎 make 将某些先决条件随机视为仅订单先决条件,导致它们被排除在依赖它们的静态库目标之外。大多数时候,构建工作会找到,但偶尔会构建一些 .cpp 文件,但不包含在 .a 中。当我使用 --debug 运行 Make 时,我看到了可疑先决条件的以下输出。
Prerequisite `blah.o' is newer than target `/path/to/foo.a`
Prerequisite `blah1.o' is newer than target `/path/to/foo.a`
Prerequisite `blah2.o' is newer than target `/path/to/foo.a`
No need to remake target `/path/to/foo.a'
对于确实进入.a的所有先决条件,最后一行是“必须重新匹配目标/path/to/foo.a”,正如我所期望的那样。
因为 make 在几个子目录中被调用,所以 target /path/to/foo.a 被更新了几次。我们没有并行运行 make,所以我认为文件的更新不会相互影响。尽管 .o 较新,但似乎 make 故意不更新 .a 文件。制作 foo.a 的配方如下:
$(OBJLIB): $(OBJS)
$(AR) $(ARFLAGS) $(OBJLIB) $?
其中 ARFLAGS=rv 和 OBJLIB 将是 /path/to/foo.a。
我认为 .o 文件被视为仅订单依赖项是否正确?还有什么我在这里想念的吗?我正在使用 $(info) 输出 OBJLIB 和 OBJS 的内容,并且没有错误的管道 ('|') 字符进入变量内容,这会导致仅顺序依赖。