make编写教程(一)
1. make规则
如果工程没有被编译过,则所有的c文件都要编译和链接
如果工程的某几个c文件被修改,那么只编译被修改的文件,并链接目标程序
如果工程的头文件被修改,需要编译引用了此头文件的c文件,并链接目标程序
2. make的核心
target:prerequisites
command
target: 为目标文件,执行文件或标签(伪目标)
prerequisites: 生成target所需要的文件或目标
comman: make所需要执行的命令
example: PamXml: XmlConfig.o PamXml.o cc -o PamXml XmlConfig.o PamXml.o XmlConfig.o: XmlConfig.cpp XmlConfig.h cc -c XmlConfig.cpp PamXml.o: PamXml.cpp PamXml.h cc -c PamXml.cpp clean: rm PamXml XmlConfig.o PamXml.o
目标文件(target)即是PamXml和中间目标文件XmlConfig.o,PamXml.o,依赖文件即是冒号后面的cpp文件,每个.o文件都有一组依赖文件。.o文件又是可执行文件PamXml的依赖文件。
定义好依赖关系之后,后续的那一行为如何生成目标文件的操作系统指令,以tab键开头。make会比较依赖文件和目标文件的修改日期,以此来决定是否执行后续的操作系统命令。其中clean不是文件,只是一个动作名字,没有依赖文件,make不会自动执行后续定义的命令,如要执行需要显示指定。如:make clean.
3. make的工作方式
make在当前目录下寻找名为Make或make的文件;
若找到,则会找文件中的第一个目标文件,并作为最终的目标文件;
若目标文件不存在,或是依赖的.o文件的修改时间比此目标文件新,那么会执行后续定义的命令来生成该目标文件;
再根据依赖性,生成.o文件,并最终生成可执行文件。
make会一层又一层的去找文件的依赖关系,直到最终编译出第一个目标文件。
4. make中使用变量
上面的例子可以改写为:
objs=XmlConfig.o PamXml.o PamXml: ${objs} cc -o PamXml ${objs} XmlConfig.o: XmlConfig.cpp XmlConfig.h cc -c XmlConfig.cpp PamXml.o: PamXml.cpp PamXml.h cc -c PamXml.cpp clean: rm PamXml ${objs}
5. make的自动推导
make可以根据一个.o文件自动推导出所依赖的.c文件,也能够推导出cc -c .c,则可以重新编写makefile
objs=XmlConfig.o PamXml.o PamXml: ${objs} cc -o PamXml ${objs} XmlConfig.o: XmlConfig.h PamXml.o: PamXml.h .PHONY: clean clean: rm PamXml ${objs}
.PHONY表示clean是个伪目标文件。
对于clean,可以写成 -rm PamXml ${objs},”-“表示如果某些文件出现问题,不用管继续下面的事。
最新文章
- 为WebService指定线程池
- MYSQL的深入学习--优化步骤
- nginx实战2---浏览器设置缓存
- HDFS的概念
- Oracle Database常用补丁集Patch号及各版本PSU
- G面经prepare: Set Intersection &;&; Set Difference
- MySQL在windows系统中修改datadir路径后无法启动问题,报错1067
- linux 杀死进程的方法
- MTK6577 Android源代码目录
- 一个基于MBProgressHUD的自定义视图hud例子
- yii
- WPF——数据绑定及属性改变事件
- linux —— shell 编程(编程语法)
- RenderPartial: No overload for method 'Write' takes 0 arguments
- ubuntu 安装maven提示出错 The program &;#39;mvn&;#39; can be found in the following packages
- ecshop 分页小记
- 队列(FIFO)—循环队列、队列的链式存储
- json转换字符串
- jhipster安装_Windows
- Project Euler Problem8
热门文章
- 【进阶技术】一篇文章搞掂:OAuth2
- composer proc_open(): fork failed – Cannot allocate memory
- day17—Flex弹性布局详解(一)
- mysql错误:1093-You can’t specify target table for update in FROM clause的解决方法
- eval方法遇到的问题
- 【ABAP系列】SAP ABAP基础-程序优化及响应速度之LOOP
- 使用母版页的Web窗体不走Page_Load
- 线程局部存储tls的使用
- Spring学习(一)--简化Java开发,认识Spring
- 两台centos,用yum install 安装,一台成功,一台失败