c - 如何构建具有相似名称的多个目标?

标签 c unix makefile gnu-make gnu

所以我有一个与下面的问题完全相同的问题,但没有人回答。

Pattern matching Makefile with multiple executable targets

我正在尝试构建一系列小测试文件,每个文件都有一个“test*.c”模式来测试我的库。

我想编写一个 makefile,一次性为每个测试文件构建可执行文件(每个名称:test1、test2、test3 等)。但是,我不确定如何实现这一目标。 到目前为止,我有以下内容:

SRC := $(shell find *.c)
ALL_PROG := $(patsubst %.c, %, *.c)
.PHONY: all

all: $(ALL_PROG)

$(ALL_PROG): $(SRC)
    -gcc $< -o $@

这是一个糟糕的尝试,因为目标将所有 .c 文件作为依赖项,这导致了循环依赖。

使用 shell 脚本可以很容易地完成这项工作,但我想知道是否有一种方法可以完成同样的工作。

提前致谢。

最佳答案

使用 $(ALL_PROG): %: %.c 而不是 $(ALL_PROG): $(SRC)


这是我可能会与 GNU make 一起使用的 Makefile 示例:

CC      := gcc
CFLAGS  := -Wall -O2
LDFLAGS := -lm
PROGS   := $(patsubst %.c, %, $(wildcard *.c))

.PHONY: all clean test $(patsubst %, test@%, $(PROGS))

all: $(PROGS)

clean:
    rm -f $(PROGS)

$(PROGS): %: %.c
    $(CC) $(CFLAGS) $^ $(LDFLAGS) -o $@

$(patsubst %, test@%, $(PROGS)): test@%: %
    ./$^

test: $(patsubst %, test@%, $(PROGS))

和往常一样,注意缩进应该使用 Tab 而不是空格; stackoverflow.com 此处使用的编辑器会自动将它们转换为空格。

PROGS 变量将包含目录中所有 *.c 文件的名称。

.PHONY: 指令告诉 Make 哪些目标不引用实际文件。 $(patsubst %, test@%, $(PROGS)) 扩展为可执行文件名称列表,每个名称前面都有 test@:如果目录包含文件foo.cbar.c,这扩展为 test@foo test@bar

$(PROGS): %: %.c 配方将每个 .c 文件编译成相应的二进制文件。

$(patsubst %, test@%, $(PROGS)): test@%: % 配方为每个二进制文件创建一个测试目标。如果我们有文件 foo.cbar.c,则此规则扩展为 test@foo test@bar: test@%: % .这意味着对于 test@footest@bar 目标,相应的 test@% 目标需要 % 二进制。 ./$^ 依次扩展为 ./%,因此是二进制名称。 (如果你不想让 Make 显示正在运行的命令,请使用 @./$^。如果你不关心测试是否失败,请使用 -./$^.)

test 配方扩展为 test@foo test@bar 如果我们有 foo.cbar.c;即所有可能的测试目标。

可以运行make clean test重新编译目录下的所有.c文件,并执行。

如果你只担心一个特定的测试程序,比如foo.c,你可以运行make test@foo,如果会重新编译程序foo.cfoo 新。

关于c - 如何构建具有相似名称的多个目标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42662359/

相关文章:

Windows客户端和Linux服务器之间的通信?

c - 错误: expected identifier or ‘(’ before ‘.’ token

linux - getpwnam 是否尊重/etc/nsswitch.conf?

c - unix socket send() 成功,但 recv() 失败

makefile - 使用 autoconf/automake,如何指定包含文件路径?

c - 传播多个 make 命令

c - 符号文件命令适用于较旧的 gdb 但不适用于较新的 gdb

c - 算法中处理小数字时出现意外段错误

shell - 使用 sed 查找和连接行

c - 未定义对已定义函数的引用