gpt4 book ai didi

c - 制作 : compile object file twice in the same target

转载 作者:太空宇宙 更新时间:2023-11-04 03:42:48 24 4
gpt4 key购买 nike

我在 Makefile 中有以下简单问题:

%.o:: %.c
gcc -o $@ -c $<

lib1.a: test.o
ar -r $@ test.o
rm *.o

lib2.a: test.o
ar -r $@ test.o
rm *.o

all: lib1.a lib2.a

make lib1.amake lib2.a 正常工作。但是,make all 给出:

gcc -o test.o -c test.c
ar -r lib1.a test.o
rm *.o
ar -r lib2.a test.o
ar: test.o: No such file or directory
make: *** [lib2.a] Error 1

我需要执行 rm *.o 因为我希望目标文件每次都编译(在我真正的 Makefile 中,我有一个更复杂的用例,我用不同的标志编译)。

我该如何解决这个问题? make 似乎只编译了一次目标文件。

我尝试使用 .PHONY 而不是执行 rm,但同样,它只编译一次。

最佳答案

您的 makefile 有点违反 make 逻辑,这就是为什么结果不是您所期望的:

  • 在这里您定义了两个目标(lib1.alib2.a),它们具有共同的依赖关系:test.o
  • 然后定义依赖于 lib1 的规则 all(顺便说一句,应该是 .PHONY 但这不是问题) .alib2.a.

所以,为了“做”所有make 必须构建lib1.alib2.a。它们都依赖于 test.o,所以 make 构建一次 test.o,然后构建 lib1.alib2.a,期望您定义的配方将只构建这些文件,仅此而已。

问题是您在 lib1.alib2.a 的配方中删除了 test.o ,虽然构建它们不需要此操作,但这是您在清洁时而不是构建时想要做的事情。

有两种解决方法:

  1. 将删除操作移动到旨在执行此操作的规则中(例如名为 clean.PHONY 规则)。
  2. 使用intermediate targets不再需要时将被删除。事实上,如果您简单地删除 makefile 的第一条规则(%.o::%.c),because make already has an implicit rule that does that,您甚至无需考虑中间目标就可以实现这一目标。使用中间目标。

关于c - 制作 : compile object file twice in the same target,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27230791/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com