下面是这个小项目的makefile
CC=gcc
CFLAGS=-I.
DEPS = mymath.h
OBJ = main.o
LIBS=-L. -lmymath
libmymath.a: mymath.o
ar rcs $@ $^
%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
main: libmymath.a $(OBJ)
$(CC) -o $@ $(OBJ) $(LIBS)
.PHONY: clean
clean:
rm -f *.o main libmymath.a
这个 Makefile 用于自动化构建一个由两个源文件 main.c 和 mymath.c 组成的 C 程序。mymath.c 文件被编译成一个静态库 libmymath.a,然后与 main.o 链接,创建最终的可执行文件 main。
以下是 Makefile 的详细解释:
CC、CFLAGS、DEPS、OBJ 和 LIBS 变量用于定义常用值。CC 是要使用的 C 编译器,CFLAGS 是传递给编译器的标志,DEPS 是源文件依赖的头文件,OBJ 是从 main.c 生成的目标文件,LIBS 是要链接的库。libmymath.a: mymath.o 规则告诉 make 如何从 mymath.o 构建 libmymath.a。命令 ar rcs $@ $^ 用于从 mymath.o 创建静态库 libmymath.a。%.o: %.c $(DEPS) 规则是一个模式规则,告诉 make 如何从 .c 文件构建 .o 文件。命令 $(CC) -c -o $@ $< $(CFLAGS) 用于将 .c 文件编译成 .o 文件。main: libmymath.a $(OBJ) 规则告诉 make 如何构建 main 可执行文件。它依赖于 libmymath.a 和 $(OBJ)。命令 $(CC) -o $@ $(OBJ) $(LIBS) 用于将 main.o 和 libmymath.a 链接成 main 可执行文件。.PHONY: clean 行告诉 make,clean 不是一个文件名。clean: 规则用于删除所有生成的文件。当你想强制完全重新构建你的程序时,这是非常有用的。要进行编译,以ubuntu为例,首先通过sudo apt install build-essential安装make工具,然后下载上面的例程文件之后在项目目录输入make就会构建生成可执行文件了。
对于如此简单的项目自然不值得我们单独编写makefile,但是当项目的规模变大、不同模块之间的依赖越来越复杂,makefile是非常有必要的。