如何为许多单c文件程序编写更简单的makefile?

如何为许多单c文件程序编写更简单的makefile?,makefile,Makefile,我想为同一个库编写许多小示例程序,每个程序都需要gcc$OtherOpt-oxxx-lthelibname xxx.c 如何编写一个没有几十行tagret的Makefile %.o: %.c gcc $(OtherOpt) -c -o $@ -lthelibname $< 它将所有.c文件编译为具有相同基名称的.o文件对象代码。然后在您的实际目标中,您将包括所有必需的.o文件作为依赖项,并使用gcc$OtherOpt-o$@$^-lthelibname,前提是我没有误解构建的设置

我想为同一个库编写许多小示例程序,每个程序都需要gcc$OtherOpt-oxxx-lthelibname xxx.c

如何编写一个没有几十行tagret的Makefile

%.o: %.c
    gcc $(OtherOpt) -c -o $@ -lthelibname $<
它将所有.c文件编译为具有相同基名称的.o文件对象代码。然后在您的实际目标中,您将包括所有必需的.o文件作为依赖项,并使用gcc$OtherOpt-o$@$^-lthelibname,前提是我没有误解构建的设置方式

make的某些版本还支持后缀规则.c.o与%.o:%.c几乎相同,但后缀规则不能有任何依赖关系。编写.c.o:foo.h告诉make将foo.h编译为foo.c.o,而不是要求foo.h作为后缀为%.c的任何文件的依赖项%.o:%.c foo.h就可以了

它将所有.c文件编译为具有相同基名称的.o文件对象代码。然后在您的实际目标中,您将包括所有必需的.o文件作为依赖项,并使用gcc$OtherOpt-o$@$^-lthelibname,前提是我没有误解构建的设置方式

make的某些版本还支持后缀规则.c.o与%.o:%.c几乎相同,但后缀规则不能有任何依赖关系。Writing.c.o:foo.h告诉make将foo.h编译为foo.c.o,而不是要求foo.h作为任何后缀为.c的文件的依赖项%.o:%.c foo.h就可以了。

I learnd from

我从中学习


在这些情况下,模式规则是您的朋友。只要您的目标都匹配一个可预测的模式——在本例中,它们都是从foo.c创建foo的形式——您就可以编写一个用于所有目标的模式规则:

OtherOpt=-Wall -g
all: $(patsubst %.c,%,$(wildcard *.c))
%: %.c
        gcc $(OtherOpt) -o $@ -lthelibname $<

现在,您可以运行simply make来构建所有应用程序,也可以使用make appname来构建特定应用程序。在这里,我创建了一个单一的模式规则,可以在任何时候从某物创建某物时使用。我使用了$@automatic变量,它将扩展到输出的名称,$模式规则在这些情况下是您的朋友。只要您的目标都匹配一个可预测的模式——在本例中,它们都是从foo.c创建foo的形式——您就可以编写一个用于所有目标的模式规则:

OtherOpt=-Wall -g
all: $(patsubst %.c,%,$(wildcard *.c))
%: %.c
        gcc $(OtherOpt) -o $@ -lthelibname $<

现在,您可以运行simply make来构建所有应用程序,也可以使用make appname来构建特定应用程序。在这里,我创建了一个单一的模式规则,可以在任何时候从某物创建某物时使用。我使用了$@automatic变量,它将扩展到输出的名称,$Each c文件包含足够的代码来支持单个目标。我想用一条规则来获取所有目标。每个c文件包含足够的代码,用于单个目标。我想用一条规则得到所有的目标。