gpt4 book ai didi

c - 避免在 makefile 中重复行

转载 作者:太空宇宙 更新时间:2023-11-04 02:21:46 24 4
gpt4 key购买 nike

我查看了很多不同的站点以尝试找到解决方案,但我找不到任何我理解的站点不包含我不熟悉的一堆其他符号和术语。

我有一个符合以下行的 makefile:

all: x1 x2 x3 x4...x(y)

x1: x1.o static1.o static2.o
gcc -o x1 x1.o static1.o static2.o
x2: x2.o static1.o static2.o
gcc -o x2 x2.o static1.o static2.o
...
x(y); x(y).o static1.o static2.o
gcc -o x(y) x(y).o static1.o static2.o

x1.o: x1.c sample1.h sample2.h sample3.h
gcc -c x1.c

x2.o: x2.c sample1.h sample2.h sample3.h
gcc -c x2.c
...
x(y).o: x(y).c sample1.h sample2.h sample3.h
gcc -c x(y).c

static1.o: sample1.c sample1.h sample2.h sample3.h
gcc -c sample1.c sample2.h

static2.o: sample3.c sample3.h
gcc -c sample3.c

clean:
@rm -f *o x1 x2 x3... x(y)

y 用作变量,而不是实际名称的一部分。

如何使用 x%.o 之类的内容将这一切缩减为几行?

最佳答案

如果您使用的是 GNU make,则可以使用 static pattern rule .这使您可以在规则的目标中使用字符 %,并且该规则适用于 % 被任何字符串替换的所有目标名称。如果 % 出现在依赖项中,它将被相同的字符串替换。

x%: x%.o static1.o static2.o
gcc -o $@ $*.o static1.o static2.o

x%.o: x%.c sample1.h sample2.h sample3.h
gcc -c $*.c

此机制不允许您枚举all 的所有目标。为此,您需要更复杂的东西:列出 .c 文件,并将相应的目标声明为 all 的依赖项。使用 GNU make,您可以使用 wildcard function 执行此操作列出文件,然后列出函数,例如 basenameaddsuffixpatsubst或其缩写形式来转换文件名。

all: $(patsubst %.c,%,$(wildcard x*.c))

注意,我假设x后面的部分可以是任意字符串,而不仅仅是一定范围内的整数。我认为用 GNU make 坚持一个整数是可行的,但这会困难得多。

关于c - 避免在 makefile 中重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56822532/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com