Makefile学习总结

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为后缀的中间文件

Makefile学习总结_第1张图片

-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

 

你可能感兴趣的:(linux,makefile,linux)