分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
一、实验介绍--Makefile 规则进阶(2)
本次实验将介绍 makefile 中 wildcard
,VPATH
,vpath
,GPATH
,-lNAME
的使用方法及文件路径保存方法。
1.1 实验内容
- 函数 wildcard 的使用
- VPATH 和 vpath 的使用
- 文件路径的保存及 GPATH 的使用
- -lNAME 文件的使用
1.2 实验知识点
- 在变量定义或者函数引用时不能直接使用通配符,而要用
wildcard
函数来代替 VPATH
变量可以指定依赖文件的搜索路径,使用空格或冒号将多个路径分开vpath
关键字比VPATH
更灵活,可以为符合模式匹配的文件指定搜索路径,还可以清除搜索路径make 的文件路径保存算法如下:
1)在当前工作目录搜索目标文件,若不存在则执行目录搜索;
2)依赖文件也使用同样的处理方式;
3)决定目标是否需要重建时做出如下选择:
3.1)不需要重建时规则中所有文件的完整路径名有效;
3.2)需要重建时,目标的完整路径失效,目标在会在当前工作目录下重建,而非目录搜索时得到的目录,但依赖文件的完整路径依然有效;
- 若目标文件的完整路径存在于
GPATH
变量列表中,make 会使用完整路径来重建目标,而非当前工作目录 - 当出现
-lNAME
形式的文件名时,make会先查找libNAME.so
,文件不存在时查找libNAME.a
文件,路径搜索顺序为:当前目录 > VPATH or vpath 指定目录 > /lib/ > /usr/lib/ > /usr/local/lib/
-lNAME
被展开成libNAME.so
或libNAME.so
是由变量".LIBPATTERNS"
指定的
1.3 实验环境
Ubuntu系统, GNU gcc工具,GNU make工具
1.4 适合人群
本课程难度为中等,适合已经初步了解 makefile 规则的学员进行学习。
1.5 代码获取
可以通过以下命令获取代码:
$ git clone https://github.com/darmac/make_example.git
二、实验原理
依据 makefile 的基本规则进行正反向实验,学习和理解规则的使用方式。
三、开发准备
进入实验楼课程即可。
四、项目文件结构
.├── gpath_code:用于测试 GPATH │ ├── main│ └── makefile├── lib_code:用于测试 -lNAME 的使用方法│ ├── lib│ │ ├── foo_dynamic.c│ │ └── foo_static.c│ ├── main.c│ └── makefile├── vpath_code:用于测试 VPATH 和 vpath│ ├── main.c│ ├── makefile│ └── vpath.mk└── wild_code:用于测试 wildcard 函数 ├── foo1.c ├── foo1.h ├── foo2.c ├── foo2.h ├── main.c ├── makefile └── pat_make.mk
五、实验步骤
5.1 函数 wildcard 的使用
5.1.1 抓取源代码
使用如下 cmd 获取 GitHub 源代码并进入相应章节:
cd ~/Code/git clone https://github.com/darmac/make_example.gitcd make_example/chapter5
5.1.2 wildcard 的使用时机
前面章节介绍了文件通配符的使用,在规则中通配符会被自动展开,但在变量定义和函数引用时,通配符将会失效。
此时如果需要使用通配符就要使用 wildcard 函数。
它的语法格式为:$(wildcard PATTERN...)
。
在 makefile 中,它被展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表。
5.1.3 使用 wildcard 来匹配当前目录下所有的 .c 文件
此处我们用代码编译流程来进行测试,先进入 wild_code 目录:
cd wild_code
wild_code 目录下文件如下:
├── foo1.c├── foo1.h├── foo2.c├── foo2.h├── main.c└── makefile
foo1.c
定义了 foo1()
函数,打印“Hello foo1!”
,foo2.c
定义了foo2()
函数,打印“Hello foo2!”
。
main.c 依次调用 foo1() 和 foo2()。
makefile 文件内容如下:
#this is a makefile for wildcard code test.PHONY:all cleancode=$(wildcard *.c)aim=wildtest