对于我的一门课的作业,我们需要为我们的 C 程序创建一个 makefile,它比
compile: gcc whatever
更复杂。我相信我们应该做这样的事情:
outputname: file1.o file2.o file3.o file4.o
gcc -o outputname file1.o file2.o file3.o file4.o
clean:
rm -f outputname file1.o file2.o file3.o file4.o
file1.o: file1.c
gcc -c file1.c
file2.o: file2.c
gcc -c file2.c
file3.o: file3.c
gcc -c file3.c
file4.o: file4.c
gcc -c file4.c
但是必须多次列出相同的文件名让我很恼火。如果我需要更新名称,我需要确保替换文件中的每个实例。或者,如果我添加一个文件,我必须添加与文件中已有的其他四行几乎相同的新行。我已经设法非常接近上述 makefile 的功能:
files := file1.o file2.o file3.o file4.o
output := outputname
$(output): $(files)
gcc -o $(output) $(files)
clean:
rm -f $(output) $(files)
$(files): $(files:.o=.c)
gcc -c $(@:.o=.c)
我能说的唯一区别是,与第一个示例不同,如果其中任何一个 c 文件已更新,这将重新编译所有 c 文件,从而消除了 makefile 的优点之一。我还能做些什么来消除冗余但保留所有功能吗?
大多数
make
实用程序已经具有内置的隐式依赖项,例如从 .c 文件生成 .o 文件。因此,由于您没有在编译步骤中指定任何特殊内容,因此您可以将文件压缩为以下内容:
OBJS = file1.o file2.o file3.o file4.o
outputname: $(OBJS)
gcc -o outputname $(OBJS)
...它可以自己处理剩下的事情(哦——除了你可能仍然想要你的
clean:
规则)。