【问题标题】:Error in makefile that individually compiles all the .c files单独编译所有 .c 文件的 makefile 中的错误
【发布时间】:2019-12-02 15:46:50
【问题描述】:

我有一个makefile,它应该单独编译一个文件夹中的所有程序。 makefile 内容为:

SRCS = $(wildcard *.c)

PROGS = $(patsubst %.c,%,$(SRCS))

all: $(PROGS)

%: %.c
        $(CC) $(CFLAGS) -o $@ $<
clean: 
        rm -f $(PROGS)

我的文件被命名为:

d744eb7b-350a-11e5-b84e-0242ac110011_2015-08-17_11:04:23.c

d746064f-350a-11e5-b84e-0242ac110011_2015-08-17_11:03:37.c

等等。

当我运行 makefile 时,它​​显示以下错误:

makefile:5: *** target pattern contains no '%'.  Stop.

谁能告诉我什么是错的?感谢您的宝贵时间。

【问题讨论】:

  • 问题在于您的长文件名中的冒号。似乎有办法逃避这些,但看起来确实有问题。你能改变点-C 文件名的结构吗?
  • 我阅读了与@AProgrammer 相同的页面;可能可以解决这个问题,但它会非常糟糕,你的时间会花在弄清楚如何使用不同的文件名上。
  • 我同意@SteveFriedl 的观点,特别是如果您希望在更新您的make 程序时保证它会继续工作,而不是使用替代程序。
  • AProgrammer, SteveFriedl 非常感谢您的投入。我不认为我会添加任何其他复杂性,因为到目前为止,我什至不知道 makefile 在这里是如何工作的(请向我解释一下?)。我只是要重命名所有文件。

标签: c makefile


【解决方案1】:

我将输入这个作为答案:问题是由文件名中的冒号引起的,这些部分构成了时间戳。冒号的使用深深植根于 make 的工作原理中,即使您以某种方式弄清楚了,要让它取这些名字也将是一场噩梦。

@AProgrammer 注意到页面Escaping colons in filenames in a Makefile 基本上处理相同的事情,并且明确的共识是:不要那样做。

即使是这个微不足道的 makefile:

SRCS = 744eb7b-350a-11e5-b84e-0242ac110011_2015-08-17_11:04:23.c \
       d746064f-350a-11e5-b84e-0242ac110011_2015-08-17_11:03:37.c

foo : $(SRCS)
        echo $^

在我的 Linux 系统上失败,出现相同的“目标模式不包含 %”错误。

是的,如果你直接输入冒号,你可以在冒号前面放一个\,这可能会奏效,但是当你开始将这些输入到其他东西中时,由于各种宏扩展。

也许可以解决这个问题,但它会是一个 makefile 的混乱,而你必须维护它的继任者会永远恨你,并且可能会带着“我该如何解决这个混乱?”回到这里。 :-)

重命名文件以将冒号更改为(例如)下划线将解决此问题。

祝你好运。

【讨论】:

    猜你喜欢
    • 2017-03-30
    • 1970-01-01
    • 2017-12-01
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    相关资源
    最近更新 更多