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编写教程(一)的更多相关文章

  1. typecho插件编写教程1 - 从HelloWorld说起

    typecho插件编写教程1 - 从HelloWorld说起 老高 187 5月25日 发布 推荐 0 推荐 收藏 2 收藏,189 浏览 最近老高正在编写一个关于typecho的插件,由于typec ...

  2. 一个很不错的bash脚本编写教程

    转自 http://blog.chinaunix.net/uid-20328094-id-95121.html 一个很不错的bash脚本编写教程,至少没接触过BASH的也能看懂! 建立一个脚本 Lin ...

  3. DLL编写教程(绝对经典之作)

    DLL编写教程 半年不能上网,最近网络终于通了,终于可以更新博客了,写点什么呢?决定最近写一个编程技术系列,其内容是一些通用的编程技术.例如DLL,COM,Socket,多线程等等.这些技术的特点就是 ...

  4. BAT脚本编写教程(比较易懂和全面)

    这篇文章主要介绍了BAT脚本编写教程,比较易懂和全面.适合有一定编程基础的人   作者不详.敬意! echo.@.call.pause.rem(小技巧:用::代替rem)是批处理文件最常用的几个命令, ...

  5. BAT脚本编写教程简单入门篇

    BAT脚本编写教程简单入门篇 批处理文件最常用的几个命令: echo表示显示此命令后的字符 echo on  表示在此语句后所有运行的命令都显示命令行本身 echo off 表示在此语句后所有运行的命 ...

  6. BAT脚本编写教程入门提高篇

    BAT脚本编写教程入门提高篇 批处理文件的参数 批处理文件还可以像C语言的函数一样使用参数(相当于DOS命令的命令行参数),这需要用到一个参数表示符“%”. %[1-9]表示参数,参数是指在运行批处理 ...

  7. 【】Nessus安全测试插件编写教程

    Nessus安全测试插件编写教程 作者:Renaud Deraison 翻译:nixe0n 1.怎样编写一个高效的Nessus安全测试插件 在Nessus安全测试系统中, 所有的安全测试都是由ness ...

  8. sublime Text3 插件编写教程_第一课

    今天给大家分享一下编写一个Sublime Text3 插件的流程以及使用插件解决的一个实际问题. 一.开发插件的前提条件 开发sublime插件用到的是Python语言,因此必须懂Python语言的基 ...

  9. jmeter 读写excel插件编写教程系列(1) -开篇

    不知道为什么,jmeter 竟然不提供 读写excel 的Sampler! 但是在我们自动化接口测试过程中,参数化.保存测试数据,用excel 是比较好的解决方案! 接下来一段儿时间,大虫会抽出一些时 ...

  10. DLL编写教程

    本文对通用的DLL技术做了一个总结,并提供了源代码打包下载,下载地址为: http://www.blogjava.net/Files/wxb_nudt/DLL_SRC.rar   DLL的优点 简单的 ...

随机推荐

  1. BaseFragment 基类

    package com.test.mvp.mvpdemo.mvp.v6.basemvp; import android.os.Bundle;import android.support.annotat ...

  2. xxxxxxxxxxxxxxxxxxx

    <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Conten ...

  3. 【CDN+】 Spark 的入门学习与运行流程

    前言 上文已经介绍了与Spark 息息相关的MapReduce计算模型,那么相对的Spark的优势在哪,有哪些适合大数据的生态呢? Spark对比MapReduce,Hive引擎,Storm流式计算引 ...

  4. 05 | 基础篇:某个应用的CPU使用率居然达到100%,我该怎么办?

    通过前两节对平均负载和 CPU 上下文切换的学习,我相信你对 CPU 的性能已经有了初步了解.不过我还是想问一下,在学这个专栏前,你最常用什么指标来描述系统的 CPU 性能呢?我想你的答案,可能不是平 ...

  5. 【ABAP系列】SAP 后台JOB如何DEBUG

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP 后台JOB如何DEBUG ...

  6. SEC1- 数据库的相关概念

    一.数据库的好处1. 可以持久化数据到本地2. 结构化查询   二.数据库的常见概念1. DB:data base数据库,存储数据的容器2. DBMS:database management sysy ...

  7. UI自动化处理文件上传

    UI自动化处理文件上传 import win32guiimport win32con def set_uploader(self, file_path): sleep(2) self.file_pat ...

  8. Object.watch

    /*  * object.watch polyfill  *  * 2012-04-03  *  * By Eli Grey, http://eligrey.com  * Public Domain. ...

  9. Python入门习题4.文本进度条

    例4.1.设置一组文本进度条,使之运行效果如下: --------执行开始--------% 0 [->**********]%10 [*->*********]%20 [**->* ...

  10. 阿里云ECS服务安装 nginx+php+MariaDB完整版

    安装 Nginx想在 CentOS 系统上安装 Nginx ,你得先去添加一个资源库,像这样: vim /etc/yum.repos.d/nginx.repo使用 vim 命令去打开 /etc/yum ...