
make工程管理器
发布日期:2021-05-19 03:28:00
浏览次数:12
分类:博客文章
本文共 2620 字,大约阅读时间需要 8 分钟。
1.概述
大型程序中,人们希望工具自动识别修改的文件,而且不需要输入冗长的命令,就可以进行编译链接等操作,于是make工程管理器应运而生。
- make可以自动识别文件时间戳,只处理修改的文件;
- make动作的依据是makefile文件
2 makefile基本结构
makefile通常包含:
- target:需要make创建的目标体,通常为目标文件和可执行文件
- dependency_file:target依赖的文件
- command:创建target时需要执行的命令,此行必须用Tab开头
target:dependency_files command /* 该行必须以Tab键开头,否则报错 */
举例说明:
#The simplest examplehello.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 davidkang.o:kang.c kang.h head.h gcc -Wall -O -g -c kang.c -o kang.oyul.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.oCC = gccCFLAGS = -Wall -O -gdavid:$(OBJS) $(CC) kang.o bar.o -o davidkang.o:kang.c kang.h head.h $(CC) $(CFLAGS) -c kang.c -o kang.oyul.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.oCC = gccCFLAGS = -Wall -O -gdavid:$(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.cOBJS = kang.o yul.oCC = gccCFLAGS = -Wall -O -gdavid:$(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.oCC = gccCFLAGS = -Wall -O -gdavid:$(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目录
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年05月11日 07时31分49秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Win10禁用自带的笔记本键盘
2019-03-16
写时复制集合 —— CopyOnWriteArrayList
2019-03-16
什么是redis的缓存雪崩, 穿透, 击穿?
2019-03-16
【转载】DSP基础--定点小数运算
2019-03-16
idea thymeleaf页面变量报错解决
2019-03-16
云游戏,打响5G第一战
2019-03-16
Docker 拉取镜像速度太慢
2019-03-16
勒索病毒Kraken2.0.7分析
2019-03-16
MySQL错误1366处理方法
2019-03-16
wxwidgets绘图
2019-03-16
wxwidgets事件处理
2019-03-16
wxwidgets自定义事件+调试
2019-03-16
wxwidgets编写多线程程序--wxThread
2019-03-16
三维点云处理
2019-03-17
vue 权限管理 菜单按钮权限控制(7)
2019-03-17
vue 权限管理 主题切换(8)
2019-03-17
webpack的安装和使用
2019-03-17
Vue.js学习-15-v-for循环数组内容
2019-03-17
kafka超时错误或者发送消息失败等错误,排错方式
2019-03-17