linux下makefile中cp,make与makefile 的理解

当我们写程序过程中存在多个文件之间有复杂的包含关系时,若修改了其中一个源文件,就重新编译所有文件,一般是不必要的,并且当文件很多时,就显得非常笨拙。所有包含该文件的文件需要重新编译,而其它无关系的文件则不需要编译,但往往判断的这个过程会很令程序员头疼,并且一不小心就会出现某些需要重新编译的文件被遗漏的情况,这样就会使程序无法正常工作。

make就可以解决上述问题,它会在必要时编译所有受改动影响的源文件。

但是make自身是不能完成这项任务的,我们需要为其提供一个文件,告诉它如何去处理文件之间的关系,这个文件就是makefile文件。

就是在makefile文件中按照一定的格式把要生成的文件在编译时所需要的源文件以及编译规则写出来。这样,make会根据makefile文件按照规则在需要时重新编译所有受改动影响的源文件。可以同时存在多个不同的makefile文件分别管理项目的不同部分。makefile文件一般和其它源文件放在同一目录下。

make -f  makefile文件名

-f 选项就是指定将哪个文件作为makefile文件。如果没有使用-f选项,标准版本make命令将首先在当前目录下找名字为makefile的文件,找不到会继续查找Makefile的文件。(特殊的GNU Make则会按照GNUmakefile、makefile、Makefile的顺序搜索)

makefile文件由一组依赖关系和规则构成。完整的makefile文件例子会在后面列出。

makefile中的每个依赖关系由 一个目标文件(一般为要创建的可执行文件)和一组该目标所依赖的源文件组成。

makefile文件依赖关系的写法()如下:

mypro:  main.o  myc1.o

main.o:  main.c  a.h  b.h

myc1.o:  myc1.c  b.h

mypro1:  mypro1.c

最开始是目标文件名称,然后一个冒号,后面是目标文件所依赖的源文件(冒号和后面的源文件之间以及不同源文件之间用空格或制表符间隔)

特别需要注意的是,虽然makefile文件中已经写入了多个目标文件,但是如果只是这样执行 make 则make命令只会创建makefile文件中的第一个目标,即mypro

若要一次性创建makefile中的所有文件,需要在makefile文件的第一个目标定义为all(我们称之为伪目标),即:

all:  mypro  mypro1

mypro:  main.o  myc1.o

main.o:  main.c  a.h  b.h

myc1.o:  myc1.c  b.h

mypro1:  mypro1.c

或者执行make命令时,加上all参数 :  make  all

makefile文件的规则:

规则就是指当make创建目标文件时的方式,比如在编译myc1.o文件时,如何进行编译(如可能需要指定头文件的目录等)。

在此应特别注意:makefile文件中的 空格 和 制表符 是有区别的。规则所在的行必须以 制表符 开头,不可以用空格。并且makefile文件中不能以空格结尾,可能会使make命令执行失败(这属于历史遗留问题)

另外,makefile文件中可以使用宏定义。

下面举例完整的makefile文件:

定义一个命名为Makefile123的makefile文件

#cat Makefile123

all: mypro

#This is a makefile

#the compiler

CC = gcc

#the path

INCLUDE = .

#where to install

INSTDIR = /usr/local/bin

install: mypro

@if [ -d $(INSTDIR) ]; \

then \

cp mypro $(INSTDIR) &&\

chmod a+x $(INSTDIR)/mypro &&\

chmod og-w $(INSTDIR)/mypro &&\

echo "Installed in $(INSTDIR)" ;\

else \

echo "Sorry, $(INSTDIR) does not exist" ; \

fi

mypro: main.o c1.o

gcc -o mypro main.o a.o

main.o: main.c m.h

$(CC) -I$(INCLUDE) -c main.c

c1.o: c1.c

$(CC) -c c1.c

clean:

-rm main.o c1.o

1、make中的特殊符号:

•告诉make命令忽略所有错误

@  告诉make执行某条命令前不要将该条命令显示在准输出上

#  是makefile中的注释符号

CC = gcc 以及 INCLUDE = . 和INSTDIR = /usr/local/bin 是makefile中自行建立的的宏定义,引用方式为$(CC)、$(INCLUDE)和$(INSTDIR)

2、注意all只指定了一个目标mypro,所以只执行 make -f Makefile123时,则默认只创建目标mypro

我们可以看到在Makefile123文件中存在两个目标clean 和 install。

install依赖于mypro ,执行make -f Makefile123 install时,make会自行判断创建文件的正确顺序

该文件中目标install的规则由一串shell脚本命令组成,此处注意,make命令在执行规则时会调用一个shell,并且每个规则都使用一个新的shell,所以在代码结尾加上反斜杠\,使得所有shell脚本命令在逻辑上处于一行。 &&符号保证保证前面的命令执行成功后面的才会继续执行。

clean目标后面没有依赖文件,则执行 make -f Makefile123 clean时,clean对应的规则总会执行,而不是像其他目标一样只有在依赖文件发生变化时执行规则。

0b1331709591d260c1c78e86d0c51c18.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/267266.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

keil用c语言怎么编辑器,用keil软件编写单片机程序的步骤

猜你感兴趣:新手教程:单片机的学习实践步骤运用单片机便是了解单片机硬件结构,以及内部资源的运用,在汇编或C语言中学会各种功用的初始化设置,以及完成各种功用的程序编制。 运用按钮输入信号,发光二极管显…

体重 年龄 性别 身高 预测鞋码_【新手扫盲】身高体重性别年龄身体素质影响玩滑板吗?...

很多新手在迈入滑板大门之前都会有诸多顾虑,以为滑板跟其他运动一样,门槛很高我想说,滑板是项自由友好的运动下到3岁小宝宝,上到60岁以上老人只要你想玩,那就可以参与进来没有任何因素能阻止你玩滑板1、你比他高吗&…

html5点击按钮出现弹窗 怎么实现_HTML5游戏开发过程中的二三事

文/ Luiu最近跟的一款项目是HTML5手游,在这个项目中遇到并解决了诸多问题,也学习到了很多项目开发过程中需要注意的事情。这个项目自立项到现在已经过了5个多月,如今项目研发已经过了早期的忙乱阶段,于是借此机会梳理下思绪&#…

HDU 2063 过山车【二分图最大匹配】

Problem DescriptionRPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了。可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partner和她同坐。但是,每个女孩都有…

科研入门之在web of science

ISI Web of Science是全球最大、覆盖学科最多的综合性学术信息资源,收录了自然科学、工程技术、生物医学等各个研究领域最具影响力的超过8700多种核心学术期刊。利用Web of Science丰富而强大的检索功能-普通检索、被引文献检索、化学结构检索,可以方便快…

手动生成 XML

2019独角兽企业重金招聘Python工程师标准>>> private void Button1_Click(object sender, System.EventArgs e) { //创建新的xml XmlDocument doc new XmlDocument(); doc.LoadXml("<company></company>"); //设置版本信息 XmlDeclaration x…

android 资源如何下沉,个推安卓手机报告: 华为一路领跑,OV下沉市场表现不俗

近日&#xff0c;国内专业的数据智能服务商个推(股票代码&#xff1a;每日互动 300766.sz)发布《 2019 年度安卓智能手机报告》&#xff0c;对华为、小米、OPPO、vivo、三星等国内主要智能手机品牌进行盘点。数据显示&#xff0c;华为手机 2019 年表现不俗&#xff0c;不仅以25…

ISA Server 2006 升级到 TMG2010

ISA Server的下个版本TMG2010已经发布有一段时间了&#xff0c;现在正在逐渐将原来的ISA Server 2006升级到TMG2010。由于TMG2010需要64位的CPU与Windows Server 2008操作系统&#xff0c;所以&#xff0c;如果原来的ISA Server 2006是安装在32位的CPU的服务器中&#xff0c;则…

nike附近门店查询_不止5折!200+入手Nike、adidas,比“11.11”还便宜!

此次劲浪体育的“劲享万购节”优惠折扣来的非常猛&#xff01;会长先把各种活动给大家整理一下这份《如何买更省钱的详细指南》大家赶紧拿好咯&#xff01;这次活动整体分为5大部分线下实体店劲浪官方微商城京东劲浪官方旗舰店会员积分翻倍兑换当现金直播尖货限时抢总结就是一句…

Android常用类库包介绍

为什么80%的码农都做不了架构师&#xff1f;>>> 在Android 类库中&#xff0c;各种包写成android.*的方式&#xff0c;重要包的介绍如下&#xff1a; android.app&#xff1a;提供高层的程序模型、提供基本的运行环境。 android.content&#xff1a;包含各种的对设…

fastdfs 吗 支持windows_主流开源文件存储系统-fastdfs是否支持windows?你可以选择minio...

首先答案是肯定的&#xff0c;fastdfs不支持windows。 其次建议你使用Minio一、引言一般来说文件存储花钱就选择阿里云oss、七牛云等产品&#xff0c;开源的话&#xff0c;目前开源的分布式文件存储系统非常多&#xff0c;上网一搜 "Ceph&#xff0c;GlusterFS,Sheepdog,L…

Android电视关闭的闪屏动画效果

老式电视机关闭的时候画面一闪消失的那个效果&#xff1a; 首先创建一个TVOffAnimation继承于Animation&#xff1a; 首先创建一个TVOffAnimation继承于Animation 然后在initialize里面设置一些参数import android.graphics.Matrix;import android.view.animation.Accelerat…

SocketServer源码学习(二)

SocketServer 中非常重要的两个基类就是&#xff1a;BaseServer 和 BaseRequestHandler在SocketServer 中也提供了对TCP以及UDP的高级封装&#xff0c;这次我们主要通过分析关于TCP的处理逻辑来对SocketServer模块进行一个很好的理解和学习 TCPServer TCPServer 继承了BaseServ…

430f149有几种封装类型_高速光调制器的发展与封装技术研究

共读好书汪冰 黄平 杨磊摘 要&#xff1a;文章分析了100 Gbps(以下简称100 G)以太网光通信光调制器及其封装的技术发展动向&#xff0c;对比分析了10 G/40 G/100 G高速光调制器及其封装的结构特点。通过对高速光调制原理的浅析&#xff0c;论述了40 G/100 G高速光调制器在100 …

vsftp账号_Linux入门-CentOS7安装vsftp

前言vsftpd是用于类Unix系统(包括Linux)的FTP服务器。那怎么搭建呢&#xff1f;请看下文在CentOS7 64位进行安装。为了调试顺利&#xff0c;关闭selinux&#xff0c;防火墙iptables一.yum安装vsftp# yum -y install vsftpd二.启动服务# systemctl start vsftpd.service三.配置文…

android n模拟器,BlueStacks推出Android N模拟器

原标题&#xff1a;BlueStacks推出Android N模拟器IT之家1月23日消息&#xff0c;相信有不少玩家都有过在电脑上玩手游的经历&#xff0c;打怪升级这类游戏在操作似乎还是交给键盘和鼠标比较高效&#xff0c;电脑端体验安卓游戏自然就要用到模拟器了&#xff0c;但是尴尬的是似…

为UIKeyboardTypeNumberPad增加自定义按键

在 iPhone 上面開發應用程式時, 在使用輸入鍵盤時, 或多或少都會遇到客制化鍵盤的問題, 這邊筆者以簡單的數字鍵盤來示範客制化的動作. 這部份我想網路上已經有不少 sample code , 但大部份基本上都是以 SDK 3.x 的版本去實作, 以"特定寫法"來實作客制化在 iOS4 會有…

车载安卓中控改鸿蒙,教你改装车子中控安卓大屏,看一遍你就会了,改完后低配秒变高配...

因为我这个车子年代比较久了&#xff0c;所以没有中控大屏&#xff0c;需要导航的时候我都是把手机放在出风口支架这个地方&#xff0c;这种磁吸的支架有时候过减速杠一震动就掉下来了&#xff0c;我又不想在上面粘什么东西&#xff0c;所以干脆就花几百块钱买了一个能够插手机…

pip 删除安装包_Python中PIP的快速指南

无论您是Python新手还是有经验的Python开发人员&#xff0c;不使用pip安装命令是不可能编写或开发Python应用程序的。在这篇文章中&#xff0c;我将对Pip进行详细介绍。Pip是Python Package Manager的缩写。当您在系统上安装python时&#xff0c;它附带了一组预定义的包&#x…

元素不包括_干货 | FDA法规对元素杂质的限度控制及计算方法

元素杂质又称重金属&#xff0c;重金属原义指比重大于5的金属&#xff0c;元素杂质包括可能存在于原料、辅料或制剂中&#xff0c;来源于合成中催化剂残留、药品生产制备过程中引入或辅料中存在的、生产设备引入、或容器密闭系统引入。某些元素杂质不仅对药品的稳定性、保质期产…