【问题标题】:How to make makefile to use pattern rule?如何使 makefile 使用模式规则?
【发布时间】:2020-12-29 16:29:37
【问题描述】:

拥有这个简单的makefile:

VPATH = include
CC := gcc
CFLAGS := -I include -Wall -pedantic

%: %.o include.o
    $(CC) -o $@ $^

%.o: %.c
    $(CC) $(CFLAGS) -c -o $@ $< 

当我使用程序名称触发它时(与带有 .c 扩展名的源名称相同),我希望触发第一条规则(因为我只提供了一个名称 没有 扩展名) 和第二个,因为对于第一个规则,有%.o 先决条件,这正是第二个规则。

在 pwd 中有这些文件:

client.c  include  makefile  server6.c  server.c

现在如果我让make server: 会的

gcc -I include -Wall -pedantic    server.c   -o server

也就是说,第二条规则没有被触发。即使目标文件在第一条规则中作为先决条件,也没有制作目标文件的步骤。那怎么可能呢? make 只是忽略了先决条件,并尝试仅使用第一条规则进行制作。如何解决?

【问题讨论】:

    标签: makefile rules


    【解决方案1】:

    这是因为 make 有一个针对 %: %.c 的内置规则,并使 will always choose 成为一个模式规则,可以直接在需要另一个模式规则的模式规则上创建目标:

    但是请注意,其先决条件实际存在或被提及的规则始终优先于具有必须通过链接其他隐式规则建立的先决条件的规则。

    您可以运行make -rremove all the built-in rules,或者通过添加remove it yourself

    % : %.c
    

    到你的makefile。

    运行make -p -f/dev/null可以查看所有内置规则

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-05
      • 1970-01-01
      相关资源
      最近更新 更多