linux - Makefile 通配符问题

标签 linux compilation makefile gnu

因此,我在理解 % 通配符如何使用 makefile 实际工作时遇到一些问题。我已经查看了 GNU make man 中的静态模式规则,但我仍然很困惑,我觉得我已经看到它们做了类似于我下面的事情。

EXEC = a.out
CC = gcc
FLAGS = -Wall -c

$(EXEC): %.o
    $(CC) -o $(EXEC) $<
%.o: %.c
    $(CC) $(FLAGS) $<

clean:
    rm -rf *.o

我不断收到错误消息,提示 %.o 规则未定义。如果有人可以解释为什么这是错误的(可能在很多方面,猜测自动变量部分也是错误的),我们将不胜感激!

最佳答案

我不确定你的意图,但我很确定这条规则:

$(EXEC): %.o
    $(CC) -o $(EXEC) $<

不这样做。在此规则中,“%”不是任何类型的通配符,它​​只是一个字符。所以当 Make 尝试构建 a.out 时,它会寻找一个名为 %.o 的文件,找不到它,没有构建它的规则(因为没有 %.c 并且无法构建那个),然后放弃。

你的意图不清楚。如果你希望规则能够构建a.out来自a.o (同样, foo.out 来自 foo.obar.out 来自 bar.o ,依此类推),写一个 pattern rule :

%.out: %.o
    $(CC) -o $@ $<

$(EXEC): # Make will not use a pattern rule as the default, so we need this

(注意 $@ 的使用。)或者(将其限制为 EXEC 列表中的可执行文件)a static pattern rule :

$(EXEC): %.out : %.o
    $(CC) -o $@ $<

另一方面,如果您希望 Make 使用它能找到的所有源文件来构建此可执行文件,则必须执行如下操作:

SOURCES = $(wildcard *.c) # make a list a.c foo.c bar.c
OBJECTS = $(patsubst %.c, %.o, $(SOURCES)) # translate it into a.o foo.o bar.o
$(EXEC): $(OBJECTS)
    $(CC) -o $^ $<

注意 the wildcard function 的使用,和 $^它扩展到先决条件列表,还要注意“*.o”不会给你带来多大好处。

关于linux - Makefile 通配符问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25586152/

相关文章:

linux - 为什么需要僵尸进程?

剪辑汇编

python - 将值从 python 脚本返回到 makefile 变量

C++、全局变量和动态共享库

php - 需要帮助分解 PHP 脚本/超过 max_execution_time

Java实例变量初始化方法

compilation - 为什么我无法在 Ubuntu 12.04 中编译 Drwright

c++ - 当我在我的 Makefile 中链接它时,我可以从 lib 中删除一些模块吗?

c - make - 指定要从命令行链接的库(没有 Makefile)

iphone - linux下编辑二进制plist