Data: 2017.12.07
Author: cjh
Theme: Makefile Tutorial
俗话说,工欲善其事必先利其器,所以我们先来介绍一下Makefile中的特殊字符
$@ 表示目标文件
$^ 表示所有的依赖文件
$< 表示第一个依赖文件
$? 表示比目标还要新的依赖文件列表
wildcard:扩展通配符
notdir: 去除路径
patsubst:替换通配符
举例:有文件夹结构,文件夹下存在.cpp、.h和.c文件
/src/layer/arm
SOURCE := $(wildcard *.cpp) $(wildcard layer/*.cpp)$(wildcard layer/arm/*.cpp)
表示,src、src/layer和src/layer/arm下的所有*.cpp文件,前面带路径的
$(notdir $( SOURCE))将上述文件前面的路径去除
OBJS := $(patsubst %.cpp,%.o,$(SOURCE))
表示,src、src/layer和src/layer/arm下的所有*.cpp文件改成以.o为后缀的文件
头文件包含方法
INCLUDE := -I. -I./layer -I./layer/arm
-I.表示当前路径
动态库静态库添加方法
举例:库有libxxx1.a libxxx2.so
-L./ -lxxx1 –lxxx2 //记住要去掉前面的lib和后面的后缀,.a为静态库 .so为动态库
若要添加类似opencv这种库
`pkg-config opencv --libs` 记住要添加单引号
宏定义方法
#ifdef XXX 用-DXXX
#endif
#if XXX 用-DXXX= 1 or 0
#endif
编译选项
-o output_filename:确定可执行文件的名称为
-O 对程序进行优化编译、链接
-O2 比-O更好的优化编译、连接
-c:不链接。编译器只是由输入的.c等源代码文件编译生成.o为后缀的中间文件
-g:产生调试工具(GNU的gdb)所需要的符号信息
-I dirname: 将dirname所指出的目录作为编译器寻找头文件的标准路径。
例:gcc foo.c -I /home/include -o foo
-Wall:生成所有警告信息
-w:不生成任何警告信息
%标记和系统通配符*的区别
通配符%的意思是:
我要找test1.o的构造规则,看看Makefile中那个规则符合。
然后找到了%.o:%.c,
来套一下来套一下:
%.o 和我要找的 test1.o 匹配
套上了,得到%=test1。
所以在后面的%.c就表示test1.c了。
OK进行构造
通配符*的意思是:
我不知道目标的名字,系统该目录下中所有后缀为.c的文件都是我要找的。
然后遍历目录的文件,看是否匹配。找出所有匹配的项目。
Makefile工程管理
Makefile中最重要的组成部分是“规则”
规则:用于说明如何生成目标文件,规则的格式如下:
targets : prerequisites
(Tab)command
目标依赖命令
特别提醒:命令需要使用【TAB】键空格
例:led.o: led.c
gccled.c -o led.o
目标只有一个,命令可以多个
掌握这么多基本上可以看懂大多数的makefile并自己修改编写了
并提供三个版本的Makefile通用模板,分别是应用程序,静态库和动态库的模板,有需要的可以下载
参考:
http://blog.csdn.net/srw11/article/details/7516712
http://blog.sina.com.cn/s/blog_78d30f6b0101flh1.html
https://www.cnblogs.com/warren-wong/p/3979270.html