什么是makefile
一个文本形式的文件,其中包含一些规则告诉make编译哪些文件以及怎样编译这些文件。通过make命令来逐步执行Makefile定义好的编译规则。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
几个简单的makefile
Ⅰ)编译可执行程序的makefile
1 SRC=$(wildcard ./*.c) #取出所有的。c文件
2 OBJ=$(patsubst %.c, %.o, $(SRC)) #把.c结尾的替换成.o文件
3 BIN=./main
4 #BIN要生成的对象依赖所有.o文件
5 all:$(BIN)
6 $(BIN):$(OBJ)
7 gcc -o $@ $^
8
9 %.o: %.c
10 gcc -c $< -o $@ #-c 只编译不链接 -o 指定生成的对像名
11 #声明一个对象为伪对象,不需要生成的对象
12 .PHONY:clean
13 clean:
14 rm -r $(BIN) $(OBJ)
Ⅱ)编译动态链接库
1 SRC=$(wildcard ./*.c)
2 OBJ=$(patsubst %.c, %.o, $(SRC))
3 BIN=./libdynamic_test.so #lib 静态库名称 .so
4
5 $(BIN):$(OBJ)
6 gcc --share -o $@ $^ #编译或者链接动态库
7 %.o:%.c
8 gcc -c $< -o $@ -fPIC
9 clean:
10 rm -rf $(OBJ) $(BIN)
Ⅲ)编译静态链接库
1 SRC=$(wildcard ./*.c) ##取出所有的.c文件
2 OBJ=$(patsubst %.c, %.o, $(SRC)) ##把.c结尾的替换成.o文件
3 LIB=./libstatic_test.a ##lib 静态库名称 .a
4 #LIB要生成的对象依赖所有.o文件
5 all:$(LIB)
6 $(LIB):$(OBJ)
7 ar cr $@ $^ #专门用来链接生成静态库
8 %.o: %.c
9 gcc -o $@ -c $< #-c 只编译不链接 -o 指定生成的对像名
10 #声明一个对象为伪对象,不需要生成的对象
11 .PHONY:clean
12 clean:
13 rm -r $(LIB) $(OBJ)
我们可以看到上边的3个makefile都比较相似,所以可以在充分理解的前提下,把其做为一种通用的makefile合理的的使用。在上面的3个makefile中都声明了伪对象,所谓伪对象,并不是一个文件,只是一个标签,由于伪对象不是文件,所以make无法生成它的依赖关系和决定它是否要执行。我们只有通过显示地指明这个目标才能让其生效。当然,伪目标的取名不能和文件名重名,不然其就失去了伪目标的意义了。为了避免和文件重名的这种情况,我们可以使用一个特殊的标记.PHONY来显示地指明一个目标是伪目标,向make说明,不管是否有这个文件,这个对象就是伪对象。