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},”-“表示如果某些文件出现问题,不用管继续下面的事。
make编写教程(一)的更多相关文章
- typecho插件编写教程1 - 从HelloWorld说起
typecho插件编写教程1 - 从HelloWorld说起 老高 187 5月25日 发布 推荐 0 推荐 收藏 2 收藏,189 浏览 最近老高正在编写一个关于typecho的插件,由于typec ...
- 一个很不错的bash脚本编写教程
转自 http://blog.chinaunix.net/uid-20328094-id-95121.html 一个很不错的bash脚本编写教程,至少没接触过BASH的也能看懂! 建立一个脚本 Lin ...
- DLL编写教程(绝对经典之作)
DLL编写教程 半年不能上网,最近网络终于通了,终于可以更新博客了,写点什么呢?决定最近写一个编程技术系列,其内容是一些通用的编程技术.例如DLL,COM,Socket,多线程等等.这些技术的特点就是 ...
- BAT脚本编写教程(比较易懂和全面)
这篇文章主要介绍了BAT脚本编写教程,比较易懂和全面.适合有一定编程基础的人 作者不详.敬意! echo.@.call.pause.rem(小技巧:用::代替rem)是批处理文件最常用的几个命令, ...
- BAT脚本编写教程简单入门篇
BAT脚本编写教程简单入门篇 批处理文件最常用的几个命令: echo表示显示此命令后的字符 echo on 表示在此语句后所有运行的命令都显示命令行本身 echo off 表示在此语句后所有运行的命 ...
- BAT脚本编写教程入门提高篇
BAT脚本编写教程入门提高篇 批处理文件的参数 批处理文件还可以像C语言的函数一样使用参数(相当于DOS命令的命令行参数),这需要用到一个参数表示符“%”. %[1-9]表示参数,参数是指在运行批处理 ...
- 【】Nessus安全测试插件编写教程
Nessus安全测试插件编写教程 作者:Renaud Deraison 翻译:nixe0n 1.怎样编写一个高效的Nessus安全测试插件 在Nessus安全测试系统中, 所有的安全测试都是由ness ...
- sublime Text3 插件编写教程_第一课
今天给大家分享一下编写一个Sublime Text3 插件的流程以及使用插件解决的一个实际问题. 一.开发插件的前提条件 开发sublime插件用到的是Python语言,因此必须懂Python语言的基 ...
- jmeter 读写excel插件编写教程系列(1) -开篇
不知道为什么,jmeter 竟然不提供 读写excel 的Sampler! 但是在我们自动化接口测试过程中,参数化.保存测试数据,用excel 是比较好的解决方案! 接下来一段儿时间,大虫会抽出一些时 ...
- DLL编写教程
本文对通用的DLL技术做了一个总结,并提供了源代码打包下载,下载地址为: http://www.blogjava.net/Files/wxb_nudt/DLL_SRC.rar DLL的优点 简单的 ...
随机推荐
- 邮件解析 CNAME记录 A记录
域名配置 示例发信配置请至域名 service.i-test.cn DNS服务提供商处添加TXT记录,并保持SPF记录正确,否则会无法发信.*1.所有权验证类型 主机记录 主域名 记录值 状态TXT ...
- Linux 两台服务器之间传递文件
参考: https://www.cnblogs.com/clovershell/p/9870603.html linux采用scp命令拷贝文件到本地,拷贝本地文件到远程服务器 // 假设远程服务器 ...
- Linux 中设置进程通过 systemctl 启动
对于某些脚本或需要启动命令的程序,可以通过创建 xx.service 服务文件来使用 systemctl 控制. 例如,对于 docker-compose,其后台启动且忽略输出信息的命令为: $ no ...
- Codeforces Round #285 (Div. 2)C. Misha and Forest(拓扑排序)
传送门 Description Let's define a forest as a non-directed acyclic graph (also without loops and parall ...
- 使用多线程开启OCR
需求:经过opencv 或者其他算法对一张图片里面的文字内容进行切割,获取到切割内容的坐标信息,再使用ocr进行识别.一张一张识别太慢了,我们可以开启多线程识别.代码如下 threads = [] f ...
- Reinforcement Learning for Self Organization and Power Control of Two-Tier Heterogeneous Networks
R. Amiri, M. A. Almasi, J. G. Andrews and H. Mehrpouyan, "Reinforcement Learning for Self Organ ...
- 二维码生成器,基于python,segno库
import segno temp = input("Please enter value:") qr = segno.make(temp) qr.save("qrcod ...
- Pandas的基础使用
Pandas的数据结构 # 导入pandas与numpy import pandas as pd from pandas import Series, DataFrame import numpy a ...
- [fw]Understanding a Kernel Oops!
An “Oops” is what the kernel throws at us when it finds something faulty, or an exception, in the ke ...
- 浅谈XML涉及到的常见技术(编写+解析)
xml:即可扩展标记语言,用于描述关系型数据,也经常用作软件的配置文件: 1,编写xml文档一般基于一个约束文档,该文档用于规定xml的书写规范,常用的约束技术有 (1)XML ...