下面是这个小项目的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是非常有必要的。