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,一经查实,立即删除!

相关文章

spinlock与linux内核调度的关系

作者:刘洪涛,华清远见嵌入式学院高级讲师,ARM公司授权ATC讲师。 关于自旋锁用法介绍的文章,已经有很多,但有些细节的地方点的还不够透。我这里就把我个人认为大家容易有疑问的地方拿出来讨论一下。 一、自旋锁&#x…

Python参数类型

位置参数默认参数可变参数命名关键字参数关键字参数1 def position_only(a, b):2 print(a, b)3 4 def keyword(aa, bb):5 print(a, b)6 7 def arg(a, *args):8 print(a, args)9 10 def kw(a, **kwargs): 11 print(a, kwargs) 12 13 def many1(a, b, cc, *arg…

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

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

24c语言程序设计是啥,《C语言程序设计》作业答案.docx

精心整理《 C 语言程序设计》作业答案1.第 4题以下程序的输出结果是______。main(){intn[3][3],i,j;精心整理for(i0;ifor(j0;jfor(i0;ifor(j0;j)n[i1][j1]n[i][j];printf("%d\n",n[i][j]);---来源网络,仅供分享学习2/145精心整理}A.14B.0C.6D.…

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

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

c语言读入文件排序,帮忙-如何对文件排序啊

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼楼主加分哦,看看吧#include #include //#include #include #include using namespace std;void dfsFolder(string folderPath){ _finddata_t FileInfo; string strfind folderPath "\\*.*"; long Handle _…

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

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

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

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

c语言编写贪吃蛇代码无错,刚学C语言,想写一个贪吃蛇的代码

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#include#include#includetypedef struct snake{int a;int b;struct snake *u;struct snake *n;}snake,*snake1;typedef struct food{int a;int b;}food;void main(){char c,c0 d;int i,j,k,n1,t,at;snake p,q;snake *dd,…

blockchain_eth客户端安装 geth使用 批量转账(二)

回顾一下,前面我们讲到启动geth geth --rpc --datadir "F:/geth/Geth/" --light console 2>console.log 这一篇接着上面讲geth的使用,分为4个部分 1、创建账户 2、验证区块是否更新完毕 3、解锁账户 4、转账 此时进入到命令行模式 1、首先&…

CGContextAddLines和CGContextAddLineToPoint在线条半透明时候的区别

这两种都可以用来画线&#xff0c;前一种将整条线加入后画出&#xff0c;后一种对每个点进行和前一个点的连线。 sample1-(void)drawLine:(YJLines *)line{ int count [line.points count]; CGPoint addLines[count]; for (int j0; j< [line.points count]; j) { CGPoint …

android xml获取指定,android:如何从xml文件中获取信息?

我得到一个程序&#xff0c;从一个链接的服务器获取天气。我已经做了一些将字符串结合到URL的字符串。我现在需要从XML文件中获取信息。android&#xff1a;如何从xml文件中获取信息&#xff1f;这是我的代码&#xff1a;(我更换了&#xff0c;为了安全起见API KEY)package com…

科研入门之在web of science

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

手动生成 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…

序列化shelve模块

1.shelve对pickle进行封装&#xff0c;所以shelve也只能在python里使用。 shelve可以进行多次dump而且顺序不会乱。 import shelvef shelve.open(shelve_test) #打开文件方式和json&#xff0c;pickle不同。names [li,xiao,xiao,ali,lucas] dicts {lucy:1,liming:2,casio…

for循环执行 mybatis_mybatis sql循环的使用

foreach的主要用在构建in条件中&#xff0c;它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有 item&#xff0c;index&#xff0c;collection&#xff0c;open&#xff0c;separator&#xff0c;close。item表示集合中每一个元素进行迭代时的别名&#xff0c;index…

jQuery EasyUI API 中文文档 - 微调器(Spinner)

Spinner 微调器扩展自 $.fn.validatebox.defaults&#xff0c;用 $.fn.spinner.defaults 重写了 defaults。依赖validatebox用法1. <input id"ss" value"2"> 1. $(#ss).spinner({ 2. required:true, 3. increment:10 4. }); 特性其特…

android reboot 定时重启可靠吗,请教一下有人做过安卓系统 reboot 重启之后,appium 能自动重新连接吗...

就是我用 adb 的命令重启手机&#xff0c;然后 usb 是一直连着的&#xff0c;重启之后&#xff0c;我想做尝试能让 appium 自动重新连接尝试过先让driver.quit(); //driver 先退出Thread.sleep(40000)&#xff1b;线程等待&#xff0c;但是还没到 40 秒就报错了org.openqa.sele…

python常用功能_python----常用功能

sintance和typeclass Foo(object):passclass Bar(Foo):passobj Bar()# isinstance用于判断&#xff0c;对象是否是指定类的实例 (错误的)# isinstance用于判断&#xff0c;对象是否是指定类或其派生类的实例# isinstance不精准print(isinstance(obj,Foo),id(obj)) #True 35558…