Makefile常用操作及项目实战讲解

Makefile学习记录

1、Makefile一般命名为:Makefile和makefile
2、编译选择,可以选择make的文件为Make.linux
3、makefile中的所有命令必须以Teb键开头

make -f Make.linux

4、makefile通配符有三个

*	[...]

5、*代表所有的以*后面为格式的文件
6、找到当前目录下的 .c文件放入字符串objs中

objs  += $(wildcard *.c)

7、Makefile注释:

以#号注释,\是换行符

8、清除目标文件test
.PHONY 代表clean是伪目标,不会clean当成其他文件名

.PHONY : clean
clean:
	-rm -f test *.o 

9、+=对变量追加赋值,如果前面的变量赋值方式为

= 那么后面的+=也是按照:=来操作。

10、取目录函数,从文件名中取出目录部分

$(dir <names>)
eg: $(dir src/foo.c hacks)返回值是“src/ ./

make函数:

1、shell函数
会在终端以shell的命令来执行
2、error函数
产生一个错误,会使make退出
3、warning
产生警告,但不会退出make

make参数

-b
-m
忽略和其他make的兼容性
-B
认为所有目标都需要重新编译
-d
输出所有调试信息

自动化变量

$@
表示所有目标的合集,就像数组,$@依次取出目标
$%
仅当目标是函数库文件时,表示规则中的目标成员名
$<
依赖目标中的第一个目标名字
$?
所有比目标新的依赖目标的集合,以空格分隔
$^
所有依赖目标的集合,以空格分隔,如果有多个重复的,那么自动只取一个
$+
这个变量很像$^,也是所有依赖目标的集合。只是它不去除重复的依赖目标。

Makefile项目讲解

objs  :=  $(wildcard bsp/*.cpp)
objs  += $(wildcard user/*.cpp)
objs  += $(wildcard car_mode/*.cpp)
objs  += $(wildcard mqtt/*.cpp)
SRC_PATH 	:= .
LINC 	+= -I$(PWD)/include/
LINC 	+= -I$(PWD)/include/mqtt/mqtt_packet/
LINC 	+= -I$(PWD)/include/mqtt/cJSON/
LINC 	+= -I$(PWD)/include/mqtt/
LINC 	+= -I$(PWD)/include/mqtt/ZHS/
LINC 	+= -I$(PWD)/include/mqtt/SQLITE3/

LINC 	+= -I$(PWD)/include/navigation/
LINC 	+= -I$(PWD)/user/

LIB     += -L$(PWD)/lib/mqtt_lib/
LIB     += -L$(PWD)/lib/hps3d_lib/

test : $(objs)
	g++ -I include $(LINC) -o  $@ $^ -lpthread $(LIB) -l mqtta -l hps3d64 -Wl,-rpath=$(PWD)/lib/hps3d_lib/ -D__USEDEBGU=0  -lm -ldl -g
.PHONY : clean
clean:
	rm -f test *.o 

首先看makefile主要的语句

g++ -I include $(LINC) -o  $@ $^ -lpthread $(LIB) -l mqtta -l hps3d64 -Wl,
-rpath=$(PWD)/lib/hps3d_lib/ -D__USEDEBGU=0  -lm -ldl -g

根据这条语句就可以编译出目标文件,那么这条语句如何组成的呢?
一般如下:
目标文件:依赖文件
g++ -o 目标文件 依赖文件
我的还要包含多个文件夹下的依赖文件,头文件,静态、动态库文件,

1、		目标文件 					test
2、 	依赖文件    					objs
3、 	头文件路径        			LINC
4、 	\$@							代表所有目标文件test
5、		\$^ 						代表所有依赖文件合集
6-lpthread					如果使用的有多线程,编译时需要加多线程后缀
7、 	\$(LIB)						使用库的路径信息
8-l  mqtta   				链接mqtta静态库
9-l  hps3d64 				链接hps3d64静态库
10-Wl,-rpath=$(PWD)/lib/hps3d_lib		这里是使用动态库时需要添加动态库的路径信息,避免编译可以通过,程序运行找不到库。
11-D__USEDEBGU=0				代码里面的调试宏定义,可通过makefile赋值
12-lm							加入数学函数库
13-ldl						程序中使用dlopen、dlsym、dlclose、dlerror 显示加载动态库,需要设置链接选项 -ldl
14-g							用于在生成的目标可执行文件中,添加调试信息,可以使用GDB进行调试
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页