Makefile中类似命令的简化

Com*_*kup 0 c makefile gnu-make

我有一个makefile:

CFLAGS= -Wall -g

all: ex1.c 
    cc ex1.c -o ex1
    valgrind ./ex1
    cc ex2.c -o ex2
    valgrind ./ex2
    cc ex3.c -o ex3
    valgrind ./ex3

clean:
    rm -f ex1
    rm -f ex2
    rm -f ex3
Run Code Online (Sandbox Code Playgroud)

有没有什么方法可以简化这个,所以我不需要为每个文件添加3行(我期待~50个文件)而是我可以只插入一个数字,它将运行该数量的文件的命令?所有文件都具有相同的命名方案/^ex\d{1,}\.c/,并且都在同一目录中.

谢谢您的帮助.

Dum*_*001 5

你不一定需要循环:

CFLAGS= -Wall -g

ALL_EX=ex1 ex2 ex3

all: $(ALL_EX)

ex%: ex%.c
    $(CC) $(CFLAGS) $@.c -o $@
    valgrind ./$@

clean: ; rm -f $(ALL_EX)
Run Code Online (Sandbox Code Playgroud)

要添加另一个测试,您只需要exNALL_EX变量中添加另一个测试.

或者,valgrind从编译中拆分调用:

CFLAGS= -Wall -g

ALL_EX=ex1 ex2 ex3
TEST_EX=$(ALL_EX:ex%=test_ex%)

all: $(TEST_EX)
cmp: $(ALL_EX)

ex%: ex%.c
    $(CC) $(CFLAGS) $@.c -o $@
test_ex%: ex%
    valgrind ./$<

clean: ; rm -f $(ALL_EX)
Run Code Online (Sandbox Code Playgroud)

这样你也可以避免冗余的ex*.c文件重新编译.最重要的是:通过这种方式,您可以将编译和测试并行化make -j.