【问题标题】:why can't this makefile work?为什么这个makefile不能工作?
【发布时间】:2013-04-07 20:02:42
【问题描述】:

我使用自动变量($@,$^)和模式(%)编写了以下makefile,但它不能与gnu make一起使用:

TARGET = edit
SRCS = $(wildcard *.c)
OBJS = $(SRCS:%.c=%.o)
$(TARGET) : $(OBJS)
    gcc $^ -o $(TARGET)
%.o : %.c
    gcc $< -c $@

我在工作目录中有 foo.c ,bar.c 。 错误是:

gcc foo.c -c foo.o
gcc: foo.o: No such file or directory
make: *** [foo.o] Error 1

我对@9​​87654325@ 和pattern rules 感到很困惑,如何准确地使用它们?他们有什么关系吗?

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    你的规则是错误的。应该是:

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

    【讨论】:

    • 谢谢,我太粗心了!但是为什么我在用gcc -c $&lt; -o $@ 替换gcc -c $^ -o $@ 时看不到任何区别?
    • 我不确定我是否理解您的回复。你仍然看到错误?你能用新的错误输出更新你的问题吗?您预计会看到什么不同?
    • 我认为您可能混淆了您所说的内容。我认为您的意思是“为什么将gcc -c $&lt; -o $@ 替换为gcc -c $^ -o $@ 时看不到区别?”因此,与其查看第一个依赖项,不如查看所有依赖项。答案是每个.o 文件只有一个依赖关系:它来自的.c 文件。所以在这种情况下$^$&lt; 没有区别。
    【解决方案2】:

    如果您不是专家,那么带有所有这些符号的传统 makefile 语法会令人困惑。在makepp 中,您可以使用自我解释长名称(并且第二行不需要以制表符开头):

    %.o : %.c
        gcc -c $(input) -o $(ouptut)
    

    至于您的问题:虽然这些变量对所有规则都很有用以避免冗余,但它们对模式规则至关重要。您怎么知道当前正在编译您的众多输入文件中的哪一个。

    makepp 还有很多。除了做 GNU make 能做的几乎所有事情,还有更多有用的事情,你甚至可以通过一些 Perl 编程来扩展你的 makefile。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-11
      • 2014-03-30
      • 2015-05-19
      • 2011-04-15
      相关资源
      最近更新 更多