一、Makefile的作用
Makefile文件实质上就是一个工程代码编译脚本,一旦写好,只需要一个make命令,整个工程就会自动按照脚本的规定方式编译,极大的提高了软件开发的效率。
二、make 命令使用
三、通用Makefile框架,适用于一般中小型项目
TARGET := ../bin/main
CC := gcc
INCLUDE:= -I ../include
LIBS:= -lpthread
CSRCS := $(wildcard *.c)
OBJS := $(patsubst %.c, %.o, $(CSRCS))
$(TARGET): $(OBJS)
$(CC) $+ -o $@ $(LIBS)
%.o:%.c
$(CC) -c -g $< -o $@ $(INCLUDE)
clean:
rm -rf $(OBJS) $(TARGET)
#rm *.o
其中:
TARGET: 为生成的可执行文件路径。
INCLUDE : 为工程所包含的头文件路径。
LIBS : 为工程所依赖的库的路径。
$@:目标文件的名字
$<:构造所需目标文件列表的第一个文件的名字
$^:构造所需目标件列表所有文件的名字
$?:构造所需文件列表中更新过的文件
$(basename 文件名):取得文件的名字(去掉后缀的意思)
例如: $(basename test1.c) ---------> test1
$(wildcard 寻找的文件):在系统中寻找文件
例如:$(wildcard *.c) 找到系统中所有后缀为.c的文件,返回成以空格隔开的一整行字符,如test1.c test2.c test3.c 这样。
$(patsubst 要被替换的字符串,用来替换的字符串,被处理的字符串):$(subst .c,.o,test1.c test2.c) --------------->test1.o test2.o
四、库依赖顺序
当一个工程链接的库较多时,很多时候因为库之间的依赖问题导致一直编译不过。此时要捋清库之间的依赖关系,然后按依赖顺序(越底层的库越往后放)链接即可。
顺序应该如下:
LIBS := -l(应用层lib) -l(基础lib) -l(系统lib)
查看库依赖关系的命令有为:
# readelf -d [库名]
# ldd [库名]