一、通用Makefile文件的编写
(1)、什么是通用Makefile?
这里的通用Makefile指的是它既能编译可执行文件、也能编译动态链接库、又能编译静态库,只需要更改很少的内容即可。
(2)、写一个通用Makefile
#-------------------------配置区域-----------------------
#DIR指的是.o文件和.c文件所在的目录
DIR=
#BIN指的是最终生成的目标对象名(包括路径),它可以是可执行程序、动态链接库或静态链接库
BIN=$(DIR)/
#SHARE特指链接生成动态链接库对象时的编译选项
SHARE=--share
#CFLAG即compile flag,表示在编译时所加入的选项参数
#参数包括
#-Wall : 编译后显示所有警告信息
#-g : 编译时加入调试信息,以便之后可以用gdb调试
#-fPIC : 编译动态链接库时加入的选项
#-I./inc: -I选项指定从哪个目录寻找头文件,在这指定之后,在源文件中包含头文件就可以使用<>,这里./inc即为指定的目录
CFLAG=
#LFLAG即library flag,表示链接生成可执行程序时所要链接的所有库的选项参数
#-L./lib : -L指示动态/静态链接库所在的目录,这里./lib即所在的目录
#-l : -l指示动态/静态链接库的名字,注意: 这里的库名字并不包括前缀(lib)和后缀(.a或.so)
#$(SHARE) : 取SHARE变量对应的动态链接库链接选项--share
LFLAG=
#CC即编译链接命令gcc -o 用于编译或者链接动态库以及可执行程序
CC=gcc -o
#AR即ar -cr ,ar -cr是专门链接生成静态库的命令
#-c : 即create,创建静态库
#-r : 即replace,当静态库改变时,替代原有静态库
AR=ar -cr
#最终用的是哪个链接命令
#链接生成动态库和可执行程序用CC
#链接生成静态库用AR
CO=$(CC)
#-------------------------以下为通用不变区域-----------------------
#SRC指的是指定目录下的所有.c文件名,OBJ指的是指定目录下的所有.o文件名
SRC=$(wildcard $(DIR)/*.c)
OBJ=$(patsubst %.c, %.o, $(SRC))
#链接命令
all:$(BIN)
$(BIN):$(OBJ)
$(CO) $@ $^ $(LFLAG)
#编译命令
$(DIR)/%.o:$(DIR)/%.c
$(CC) $@ -c $< $(CFLAG)
#清除无用文件
.PHONY:clean
clean:
rm $(OBJ) $(BIN)
上面就是一个通用的Makefile模板,我们可以通过它可以写出对可执行程序编译的Makefile,也可以写出对动态链接库编译的Makefile,当然也可以用它写出对静态库编译的Makefile。
下面,我们通过一个工