make工程管理器
1.概述
大型程序中,人们希望工具自动识别修改的文件,而且不需要输入冗长的命令,就可以进行编译链接等操作,于是make工程管理器应运而生。
- make可以自动识别文件时间戳,只处理修改的文件;
- make动作的依据是makefile文件
2 makefile基本结构
makefile通常包含:
- target:需要make创建的目标体,通常为目标文件和可执行文件
- dependency_file:target依赖的文件
- command:创建target时需要执行的命令,此行必须用Tab开头
target:dependency_files
command /* 该行必须以Tab键开头,否则报错 */
举例说明:
#The simplest example
hello.o: hello.c hello.h
gcc -c hello.c -o hello.o
使用make target的形式:
make hello.o
一个稍微复杂一点的例子:
- 有3个target,david、kang.o、yul.o,其中david依赖后面两个target
- make david时,会执行下面的cmd,会一级一级向下检查
david:kang.o yul.o
gcc kang.o bar.o -o david
kang.o:kang.c kang.h head.h
gcc -Wall -O -g -c kang.c -o kang.o
yul.o:bar.c head.h
gcc -Wall -O -g -c yul.c -o yul.o
3 makefile变量
3.1 变量
挨个输入文件和编译选项比较麻烦,makefile支持用变量代替target、depandence、cmd以及其他部分。
分两种:
- 递归展开方式 VAR=var,在引用处展开;需注意对自己的递归可能导致无限循环
- 例如 CFLAGS = $(CFLAGS) -O,就会无限循环
- 简单扩展方式 VAR := var,在定义处一次性展开
用变量重写上面的例子
OBJS = kang.o yul.o
CC = gcc
CFLAGS = -Wall -O -g
david:$(OBJS)
$(CC) kang.o bar.o -o david
kang.o:kang.c kang.h head.h
$(CC) $(CFLAGS) -c kang.c -o kang.o
yul.o:yul.c yul.h
$(CC) $(CFLAGS) -c yul.c -o yul.o
3.2 预定义变量
- AR,库文件维护
- AS,会便器
- CC,C编译器
- CPP,C预编译器
- CXX,C++编译器
- FC,Fortan编译器
- RM,文件删除
- ARFLAGS
- ASFLAGS
- CFLAGS
- CPPFLAGS
- CXXFLAGS
- FFLAGS
3.3 自动变量
target和depandence已经出现了文件,后面可用自动变量替代这些文件,起到简化makefile的目的。
- $* : 不包含扩展名的target文件名称
- $+ : 所有的depandence文件,以空格分开,可能有重复
- $< : 第一个depandence文件
- $? : 所有时间戳比target晚的depandence文件
- $@ : target文件的完整名称
- $^ : 所有的depandence文件,以空格分开,不重复
- $% : 如果目标文件是归档文件,则表示目标的归档成员名称
用自动变量重写刚才的例子:
OBJS = kang.o yul.o
CC = gcc
CFLAGS = -Wall -O -g
david:$(OBJS)
$(CC) $^ -o $@
kang.o:kang.c kang.h head.h
$(CC) $(CFLAGS) -c $< -o $@
yul.o:yul.c yul.h
$(CC) $(CFLAGS) -c $< -o yul.o
4 makefile规则
上述makefile写的比较全面,即显性方式。还支持隐形方式去掉,简化一些代码
4.1 隐含规则
只要告诉make目标文件,make会自动搜索隐含规则完成编译。
上述makefile可以进一步简化,省掉了最后两行,依赖中的kang.o yul.o,make会自动搜索kang.c和yul.c
隐含规则只能查找相同文件名,例如test.o会查找test.c
OBJS = kang.o yul.o
CC = gcc
CFLAGS = -Wall -O -g
david:$(OBJS)
$(CC) $(CFLAGS) $^ -o $@
常用的隐含规则:
- C编译,.c编程.o:$(CC) -c $(CPPFLAGS) $(CFLAGS)
- C++编译,.cc或.c编程.o:$(CC) -c $(CPPFLAGS) $(CXXFLAGS)
- Pascal编译,.p编程.o:$(PC) -c $(PFLAGS)
- Fortan编译,.r编程.o:$(FC) -c $(FFLAGS)
4.2 模式规则
定义相同处理规则的多个文件,文件必须用%开头
上述可改写为:
OBJS = kang.o yul.o
CC = gcc
CFLAGS = -Wall -O -g
david:$(OBJS)
$(CC) $(CFLAGS) $^ -o $@
%.o:%.c
$(CC) -c $(CFLAGS) $< -o $@
5 make管理器的使用
- -C dir : 读入指定目录下的makefile,变换目录
- -f file : 读入file,作为makefile文件
- -i : 忽略所有命令执行错误
- -I dir : 指定被包含的makefile所在目录
- -n : 只打印命令,但不执行
- -p : 显示make变量数据库和隐含规则
- -s : 在执行命令时不显示命令
- -w : 如果make改变目录,则打印当前目录
附录1:gcc常用参数
- -c :只编译,不链接,生成.o文件
- -S :只编译,不汇编,生成汇编文件
- -E :只进行预处理
- -g :包含调试信息
- -o file : 将file文件指定为输出文件
- -v : 打印编译过程和版本
- -I dir :在头文件搜索目录中增加dir目录
make工程管理器的更多相关文章
- Linux工程管理器——make
一.定义 工程管理器,顾名思义,是指管理较多的文件 Make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能构根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Make ...
- Makefile工程管理器及万能模板
Linux 环境下的程序员如果不会使用GNU make来构建和管理自己的工程,应该不能算是一个合格的专业程序员,至少不能称得上是 Unix程序员.在 Linux(unix )环境下使用GNU 的m ...
- Django 源码小剖: Django ORM 查询管理器
ORM 查询管理器 对于 ORM 定义: 对象关系映射, Object Relational Mapping, ORM, 是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换.从 ...
- elecworks 图框管理器
图框管理器中存储的是图纸模板(图框),新建图框的步骤如下: 1 数据库---图框管理器----新建 2 打开图框属性设置窗口,设置图框属性,设置好之后点击确定 3 右击图框图标---打开(进入图框绘制 ...
- Node.js包管理器:
Node.js包管理器: 当我们要把某个包作为工程运行的一部分时,通过本地模式获取,如果要在命令行下使用,则使用全局模式安装 使用全局模式安装的包并不能直接在JavaScript文件中用require ...
- Django ORM 查询管理器
Django ORM 查询管理器 ORM 查询管理器 对于 ORM 定义: 对象关系映射, Object Relational Mapping, ORM, 是一种程序设计技术,用于实现面向对象编程语言 ...
- DLL何时需共享内存管理器
Delphi创建DLL时,IDE自动生成的文档中写得很清楚,当在DLL中以动态数组或String做为参数或返回值时(即RTL自动维护的数据类型),请在每个工程文件的第一个单元加上ShareMem.这样 ...
- [Visual Studio] 记一次排错:打不开 Nuget 包管理器里的安装package页面,无法 安装 / 恢复 包
出差一阵子PC很久没用了, 回来在用Visual Studio (2017) 的时候, 工程里无法安装Package了 >_< --- 也不知道电脑做了什么?--- Nuget包管 ...
- WorldWind源码剖析系列:图层管理器按钮类LayerManagerButton和菜单条类MenuBar
WorldWindow用户定制控件类中所包含的的可视化子控件主要有:图层管理器按钮类LayerManagerButton和菜单条类MenuBar.BmngLoader类中所包含的的可视化子控件主要有: ...
随机推荐
- iOS开发针对对Masonry下的FPS优化讨论
今天博客的内容就系统的讨论一下Masonry对FSP的影响,以及如何更好的使用Masonry.如果你对iOS开发足够熟悉的话,那么对Masonry框架应该不陌生.简单的说,Masonry的诞生让Aut ...
- PHP通过Zabbix API获取服务器监控信息
开源监控系统Zabbix提供了丰富的API,供第三方系统调用. 基本步骤如下: 1.获取合法认证:连接对应Zabbix URL,并提供用户名和密码,HTTP方法为"POST",HT ...
- 【转】在SAE部署WordPress
原文:http://blog.csdn.net/jackrex/article/details/9305835 虽然几个月前我是以安装应用的形式将wordpress部署在sae,虽然当时sae应用商店 ...
- 抛弃JQ,回归原生js……
之前我写过一篇文章叫做<jq不会被淘汰>--而事实上它真的不会被淘汰,因为即使在mvvm框架盛行的今天,原生js的api越来越友好的今天,jq依然在用户量上是霸主-- 但是今天我们要讨论的 ...
- Celery 源码解析七:Worker 之间的交互
前面对于 Celery 的分布式处理已经做了一些介绍,例如第五章的 远程控制 和第六章的 Event机制,但是,我认为这些分布式都比较简单,并没有体现出多实例之间的协同作用,所以,今天就来点更加复杂的 ...
- PHP strftime()函数输出乱码问题
直接调用strftime() strftime(time_buf, 80, "%a, %e %b %G %T %z", p_stime); 输出为 Îå, 18 12ÔÂ 201 ...
- [最短路]P1119 灾后重建
题目背景 B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两个重建完成的村庄的公路才能 ...
- JIT——即时编译的原理
介绍 java 作为静态语言十分特殊,他需要编译,但并不是在执行之前就编译为本地机器码. 所以,在谈到 java的编译机制的时候,其实应该按时期,分为两个部分.一个是 javac指令 将java源码 ...
- 理解MVC入门基础原理
今天,我将开启一个崭新的话题:ASP.NET MVC框架的探讨.首先,我们回顾一下ASP.NET Web Form技术与ASP.NET MVC的异同点,并展示各自在Web领域的优劣点.在讨论之前,我对 ...
- JAVAFX-5事件总结
事件监听 在RIA 或者说 桌面客户端gui android 开发中,事件的机制是必须的要学习了解的, 分类处理类型 在Java GUI 和swing中,事件通常通过实现listener的接口函数,并 ...