Makefile的简单使用

一、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 [库名]

猜你喜欢

转载自blog.csdn.net/fangye945a/article/details/85039249
今日推荐