我目前正在学习C,现在我需要编写Makefile的教程,但我很难为多个源编写Makefile。有人能告诉我如何更正多个源的Makefile代码吗?所有文件都在同一个目录中,共有3个C源文件,如filename1 / 2/3等所示。我试图在一个makefile中构建3个独立的程序,包含3个源文件
OPT = -O4
all: filename1
filename1: filename1.o
gcc $(OPT) -o filename1 filename1.o
filename1.o: filename1.c
gcc $(OPT) -c filename1.c
filename2: filename2.o
gcc $(OPT) -o filename2 filename2.o
filename2.o: filename2.c
gcc $(OPT) -c filename2.c
filename3: filename3.o
gcc $(OPT) -o filename3 filename3.o
filename3.o: filename3.c
gcc $(OPT) -c filename3.c
clean:
rm -f *.o
rm -f filename1
rm -f filename2
rm -f filename3
或者我的代码是否符合我的要求?
答案 0 :(得分:4)
好吧,因为你正在创建三个不同的程序,所以似乎没有任何错误与makefile。它应该工作。
使其更有用的一些建议:
1)声明“全部”和“干净”的目标是虚假的。这将阻止Make尝试创建名为“all”和“clean”的文件。
.PHONY: all clean
2)您可能希望您的“全部”目标构建所有三个程序,而不仅仅是一个程序,因此将其更改为:
all: filename1 filename2 filename3
3)如果您最终使用它来制作三个以上的程序,并且它们都共享相似的构建过程,您可以使用模式匹配将规则折叠为较小的集合。请参阅Martin Beckett的答案。但是,这不是必要的。
答案 1 :(得分:3)
你的makefile应该可以工作,但它可以简化。
make
实用程序支持隐式规则。这可以简化常见操作,例如将C源代码文件编译为目标文件并将目标文件编译为可执行文件。
CC=gcc
CFLAGS=-O4
all: filename1 filename2 filename3
%.o: %.c
$(CC) $(CFLAGS) -c $<
%: %.o
$(CC) $(CFLAGS) -o $* $<
clean:
rm -f *.o
rm -f filename1
rm -f filename2
rm -f filename3
答案 2 :(得分:2)
对于由三个这样的文件构建的三个独立程序,您只需使用:
PROGRAMS = filename1 filename2 filename3
all: ${PROGRAMS}
clean:
rm -f ${PROGRAMS} ${PROGRAMS:=.o}
您可以添加:
CFLAGS = -O4
获得该级别的优化。您可以使用宏而不是rm
命令;通常,成熟的makefile
使用了很多宏:
RM_F = rm -f
如果你的目标是GNU Make,你可以添加:
.PHONY: all clean
列表继续。
关键是make
知道如何构建单文件程序,它知道如何将C源代码编译成目标文件,所以你不必训练它来做那件事。 / p>
答案 3 :(得分:2)
使用模式匹配:
PROGS = filename1 filename2 filename3
all: $(PROGS)
# cancel implicit program rule
%: %.c
%: %.o
$(CC) $(LDFLAGS) $^ -o $@
%.o: %.c
$(CC) $(OPT) $(CFLAGS) $^ -c -o $@
clean:
rm -f $(PROGS) *.o
.PHONY: all clean
答案 4 :(得分:0)