make编写教程(一)

摘要:
所有c文件都必须编译和链接。如果修改了项目的某些c文件,请执行文件或标签(伪目标)先决条件:生成目标所需的文件或执行目标所需命令通用:例如:rmPamXmlXmlConfig。oPamXml。o目标文件(target)是PamXml,中间目标文件是XmlConfig。o、 并且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编写教程(一)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Oracle SQL优化delphi 多媒体 操作 wave(1)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SSH三大框架整合步骤

Struts2:需要整合的第一个框架: 1.创建一个动态web项目 2.导入struts2必须的jar 放到 lib目录下 ,再 build path 添加web工程中 3.配置struts2的核心配置文件:struts.xml 4.在web.xml文件中添加struts2的核心过滤器 5.添加测试页面 6.导入tomcat jar包 对j2e...

linux上实现jmeter分布式压力测试(转)

摘要:最近根据公司工作的需求,学习了一些压力测试的知识,目前,公司使用的是jmeter进行压力测试。下面就记录下近期的学习。我想将这次的博文分成三个部分:1、开始测试前的准备(测试环境的搭建)2、在一台linux上测试3、多台linux分布式测试首先来看看测试环境的搭建。我是自己创建的linux虚拟机,所以就用它来说说吧。安装linux的过程就不多说了,...

udev简述

udev 是 Linux 内核的设备管理器。总的来说,它取代了devfs和hotplug,负责管理/dev中的设备节点。同时,udev 也处理所有用户空间发生的硬件添加、删除事件,以及某些特定设备所需的固件加载。 udev是systemd的组成部分,默认已安装,有关信息可查阅systemd-udevd.service的手册页。 udev和devfs比较 1...

SAPCAR 压缩解压软件的使用方法

  SAPCAR 是 SAP 公司使用的压缩解压软件,从 SAP 网站下载的补丁包和小型软件基本都是扩展名为 car 或 sar 的,它们都可以用 SAPCAR 来解压。下面是它的使用说明: 用法: 创建新档案:SAPCAR -c[vir][f archive] [-P] [-C directory]   [-A filename] [-T filena...

influxdb 配置文件注释

### Welcome to the InfluxDB configuration file. # The values in this file override the default values used by the system if # a config option is not specified. The commented o...

【基本知识】verilog中 `define 的使用

背景:   在最近实战开发中发现:对外部芯片进行初始化时,往往需要定义大量参数。   若直接在module中通过localparam或者parameter进行参数定义的话,会带来两个问题:     1.代码长度增加,不够美观;     2.不利于参数和代码修改;   为了解决这两个问题,我想到了在之前在《verilog数字系统设计教程》(夏闻宇)看到过的`...