make详解

4 篇文章 0 订阅
订阅专栏

Make

1. 学习make的必要性

在Linux中,有一个用来维护程序模块关系和生成可执行程序的工具-make。他可以根据程序模块的修改情况重新编译链接生成中间代码或最终的可执行程序。执行make 命令,需要一个名为“makefile”或“Makefile”的文本文件,这个文件定义了整个项目的编译规则。它定义了模块间的依赖关系,指定文件的编译顺序,以及编译所使用的命令。有了make命令和Makefile文件,整个项目的源程序文件可以自动编译,极大地提高了软件的开发效率。在这里插入图片描述

2. make的一般使用

目标文件列表 分隔符 依赖文件列表[; 命令]
     [命令] 注意:如果命令换行写,前面加Tab键。
     [命令]

 main.o : main.c defs.h
   		cc -c main.c
  main.o : main.c defs.h;cc -c main.c
  • make如何解释执行

   过时:是指一个文件生成后,用来生成该文件的源文件或头文件被修改了,导致生成该文件所需要的源文件或头文件的修改时间比生成该文件的时间完。

编译顺序:

  1. 如果只输入make命令。那么, make会在当前目录下找名字
    “Makefile”或“makefile”的文件。也可以命名为其他的名字make -f othername
  2. 它会找文件中的第一个目标文件(target)并把这个文件作为最终的目标文件。
  3. 观察目标文件是否过时,如果过时,执行规则后面的命令。否则,不执行。
  4. 从头到尾扫描完一遍Makefile文件后,make回溯一遍。

Makefile告诉make命令如何编译和链接这几个文件

  1. 如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
  2. 如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序.
  3. 如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。

3.Makefile文件的构成

Makefile里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释。

  1. 显式规则。显式规则说明了,如何生成一个或多的的目标文件。这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。
  2. 隐晦规则。由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书写Makefile,这是由make所支持的。
  3. 变量的定义。在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点你C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。
  4. 文件指示。其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的include一样;另一个是指根据某些情况指定Makefile中的有效部分,就像C语言中的预编译#if一样;还有就是定义一个多行的命令。有关这一部分的内容,我会在后续的部分中讲述。
  5. 注释。Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用“#”字符,这个就像C/C++中的“//”一样。如果你要在你的Makefile中使用“#”字符,可以用反斜框进行转义,如:“#”。
显示规则
main.o : main.c defs.h
	 	cc -c main.c
 clean:
 		rm *.o
  1. 在规则中使用通配符
    *通配符代替了你一系列的文件,如*.c表示所有后缀为c的文件
  2. 文件搜寻
    • 如果定义了VPATH变量,make就会在当前目录找不到的情况下,到所指定的目录中去找寻文件了。VPATH = src:../headers
    • 另一个设置文件搜索路径的方法是使用make的“vpath”关键字,它可以指定不同的文件在不同的搜索目录中。
      vpath < pattern> < directories>为符合模式< pattern>的文件指定搜索目录。
      vpath < pattern> 清除符合模式< pattern>的文件的搜索目录。
      vpath 清除所有已被设置好了的文件搜索目录。
      注意:vapth使用方法中的< pattern>需要包含%字符。%的意思是匹配零或若干字符,例如,%.h表示所有以.h结尾的文件。
  3. 伪目标
    “伪目标”并不是一个文件,只是一个标签,所以make无法生成它的依赖关系和决定它是否要执行。当然,“伪目标”的取名不能和文件名重名,不然其就失去了“伪目标”的意义了。为了避免和文件重名的这种情况,我们可以使用一个特殊的标记.PHONY来显示地指明一个目标是伪目标,向make说明,不管是否有这个文件,这个目标就是伪目标
    于是整个过程可以这样写:
 .PHONY: clean
   clean:          
   	   rm *.o 

在Makefile中,一个伪目标可以有自己的依赖。在一个目录下如果需要生成多个可执行程序,可以在一个makefile中完成。

 all : prog1 prog2 prog3
 .PHONY : all
 prog1 : prog1.o utils.o
     cc -o prog1 prog1.o utils.o
 prog2 : prog2.o
     cc -o prog2 prog2.o
 prog3 : prog3.o sort.o utils.o
     cc -o prog3 prog3.o sort.o utils.o
  1. 多目标
    一个规则中可以有多个目标,规则所定义的命令对所有的目标都有效.

    mod1.o mod2.o mod3.o : commmand.c
    

这个规则同时实现给3个目标文件制定一个依赖文件.由于隐含规则的作用,它等价与下面的规则:

mod1.o : mod1.c  command.c
	gcc -c mod1.c -o mod1.o
mod2.o : mod2.c  command.c
	gcc -c mod2.c -o mod2.o
mod2.o : mod2.c  command.c
	gcc -c mod2.c -o mod2.o
隐含规则

make自动推导

main.o : main.c defs.h
	cc -c main.c
main.o : defs.h
使用变量
  1. 引用变量
    变量的引用方式是:$(变量)或者 ${变量},如果要使用字符$,要用$$来表示.

  2. 定义变量
    1.递归展开变量=

    foo = $(bar)
    bar = $(ugh)
    ugh = Huh?
    all:
    echo $(foo)
    执行“make all”将会打出变量$(foo)的值是“Huh?”
    

    2.立即展开变量:=

    x := foo
    y := $(x) bar
    x := later
    其等价于:
    y := foo bar
    x := later
    
  3. 预定义变量
    常用的自动变量:
    $@:表示一个规则中的目标文件
    $%:当规则的目标文件是一个静态库文件时,代表静态库的一个成员库.
    $<:规则中的第一个依赖文件名
    $>:规则中的第一个依赖文件名,它的值是库名.
    $?:所有比目标文件新的依赖文件列表,以空格分隔.
    $^:规则的所有依赖文件,使用空格分隔.
    $+:保留了依赖文件中重复出现的文件.主要用在程序链接时库的交叉引用场合.
    $*:他的值是目标场合去掉后缀后的名称.
    在这里插入图片描述

使用库

在大型软件开发中,通常把编译好的模块按照功能不同放在不同的库中.在Linux中,最后链接生成可执行文件时,如果链接的是一般.o文件,是把整个.o文件的内容插入到可执行文件中.而如果链接的是库,则只从库中找出程序需要的变量和函数,把它们装入到可执行文件中.使用库可以大大节省空间,所以系统提供的标准函数一般都是以库的形式提供.
库中的文件一般都是库的成员,成员的表示形式为:库员(成员名) mylib.a(file.o)
通常使用ar命令对它进行维护和管理
ar -ruv 库名 目标文件名

使用条件语句

ifeq表示条件语句的开始,并指定了一个比较条件(相等),还可以使用关键字ifneq,如果两个参数不相等.
else当条件不满足时要执行的部分
endif表示一个条件语句的结束,任何一个条件表达式都必须要以它结束

libs_for_gcc=-lgnu
normal_liba= 
foo:foo.c
ifeq($(CC),gcc)
	$(CC) -o foo foo.c $(libs_for_gcc)
else
	$(CC) -o foo foo.c $(normal_liba)
endif

ifdef用来判断一个变量是否已经定义,ifndef用来判断一个变量是否没有被定义.

bar=
foo=$(bar)
ifdef foo
frobozz=yes
else
frobozz=no
endif
make参数
  • -C dir 或者 --directory=DIR
    在读取Makefile文件之前,先切换到dir目录下.
  • -d
    make执行时打印出所有的调试信息.
  • -e
    不允许在Makefile中对系统环境变量进行重新赋值.
  • -f filename
    使用指定文件作为Makefile文件
  • -i
    忽略执行是产生的错误,不退出make
    在这里插入图片描述
make 命令详解
12-20
make 命令详解 linux make命令 详解make各种参数等
GNU make 详解
12-09
GNU Make 是一个强大的自动化构建工具,广泛用于C/C++、Java等编程语言的项目构建,尤其是在Linux和类Unix系统中。...这份"GNU make 详解"的学习资料将会为你提供全面的指南,帮助你成为真正的Linux编程高手。
Make 命令教程
weixin_45531197的博客
10-08 2430
Makefile文件由一系列规则(rules)构成。每条规则的形式如下。上面第一行冒号前面的部分,叫做"目标"(target),冒号后面的部分叫做"前置条件"(prerequisites);第二行必须由一个tab键起首,后面跟着"命令"(commands)。"目标"是必需的,不可省略;"前置条件"和"命令"都是可选的,但是两者之中必须至少存在一个。每条规则就明确两件事:构建目标的前置条件是什么,以及如何构建。下面就详细讲解,每条规则的这三个组成部分。
【Linux】-----工具篇(自动化构建工具make/makefile)
最新发布
m0_73470633的博客
07-29 822
Linux工具第四弹,自动化构建工具make/makefile介绍及操作!!细致教学!!内含丰富图解!!通俗易懂!!!
怎样写Makefile
改变不了世界也改变不了自己
10-14 1241
   无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令。不管是自己进行项目开发还是安装应用软件,我们都经常要用到makemake install。利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用makemakefile工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系。而且如此多的源文件,如果每次都
make完全详解
LWJLWJ_的博客
05-27 1万+
该篇文章为转载,是对原作者系列文章的总汇加上标注。 文章标注作者:GUYUEZHICHENG https://blog.csdn.net/weixin_38391755/article/details/80380786?spm=1001.2014.3001.5506 支持原创,请移步陈浩大神博客: http://bl...
make的命令行选项
william_djj的专栏
04-14 425
http://www.linuxsir.org/main/doc/gnumake/GNUmake_v3.80-zh_CN_html/make-09.html这些参数可以通过man手册查看(红色是比较有用的选项):-b-m忽略,提供其它版本make兼容性。-B--always-make强制重建所有规则的目标,不根据规则的依赖描述决定是否重建目标文件。-C DIR--directory=DIR在读取M...
make命令
热门推荐
alex1801
07-22 1万+
代码变成可执行文件,叫做编译(compile);先编译这个,还是先编译那个(即编译的安排),叫做构建(build)。Make是最常用的构建工具,诞生于1977年,主要用于C语言的项目。但是实际上 ,任何只要某个文件有变化,就要重新构建的项目,都可以用Make构建。 1、一个简单 makefile例子 Make这个词,英语的意思是"制作"。Make命令直接用了这个意思,就是要做出某个文件。比如,要做出文件a.txt,就可以通过以下步骤实现: 1)书写规则,...
linuxUnix环境下的makemakefile详解.rar_dividehgx_linux make详解_makefile
09-23
在Linux和Unix环境中,`make`是一个强大的自动化构建工具,它根据特定的规则来编译、链接源代码,极大地简化了软件项目的构建过程。而`makefile`则是make工具的配置文件,它定义了一系列的规则和目标,指导make如何...
MakeMakefile详解
11-02
MakeMakefile编译系统的详细讲解和常见的语法,对Android编译系统可以有更基础的了解
Linux/Unix环境下的make命令详解
07-07
Make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作。而makefile文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系。makefile文件是许多编译器--包括Windows NT下的编译器--维护编译信息的常用方法,只是在集成开发环境中,用户通过友好的界面修改makefile文件而已。
GNU MAKE 详解
03-18
GNU Make 是一个强大的自动化构建工具,它允许程序员和系统管理员编写Makefile,通过这些文件来组织和自动化编译、链接和其他软件构建过程。在大型项目中,GNU Make 的使用能够极大地提高开发效率,减少手动执行命令...
linux内核配置make-menuconfig菜单详解.doc
02-26
Linux 内核配置 Make Menuconfig 菜单详解 Linux 内核配置是 Linux 操作系统的核心组件之一,对于嵌入式系统的开发非常重要。在 Linux 内核配置过程中,我们需要使用 Make Menuconfig 工具来配置内核的各个组件。...
make学习
weixin_38367817的博客
11-13 360
高级语言需要经过编译和链接,最终生成可执行的目标代码即C/C++源代码要经过汇编器,汇编语言源代码经过汇编器,生成目标文件。如果有多文件要编译。为了便于管理,可将具体操作按一定的规则写入makefile文件,make工具根据makefile文件的要求执行相关命令生成目标文件。 GCC(包含预处理器、编译器、汇编器、链接器等工具): GNU下编译器及相关工具的集合。GCC原名为GNU C语言编译...
[C语言] make命令详解
言之。
12-07 1万+
make是一个常用的构建工具,它使用 Makefile 中的规则来编译和链接源代码文件,生成可执行文件或库文件。命令之前,需要在当前目录下有相应的 Makefile 文件。命令的输出参数及其说明,可以根据实际需求选择适合的选项。:指定使用其他名称的 Makefile 文件进行构建。:执行构建时不显示详细的构建过程信息,只显示错误消息。:显示构建过程中将要执行的命令,但不实际执行。:强制重新构建所有目标,即使目标已经是最新的。:以调试模式执行构建,显示详细的调试信息。:指定要构建的目标名称,例如。
Make命令
靡不有初,鲜克有终
11-03 1183
0x01 Make语法教程 参考:Make语法教程 0x02 概述 [目标]:[前置条件] [命令] "目标"是必需的,不可省略;"前置条件"和"命令"都是可选的,但是两者之中必须至少存在一个。 "目标"是否重新构建的判断标准:只要有一个前置文件不存在,或者有过更新(前置文件的last-modification时间戳比目标的时间戳新),"目标"就需要重新构建。 命令之前必须有一个tab键...
$(CLINTROOT)/.generated: flock -x $@ $(MAKE) clint && touch $@
04-27
$(CLINTROOT)/.generated是一个文件路径,它表示一个名为".generated"的文件在路径$(CLINTROOT)下。这个文件的生成是通过执行以下命令实现的: flock -x $@ $(MAKE) clint && touch $@ 这个命令使用了flock命令来获取对文件$@(即$(CLINTROOT)/.generated)的独占锁,然后执行$(MAKE) clint命令,并在执行成功后使用touch命令更新文件的修改时间。 相关问题: 1. $(CLINTROOT)是什么路径? 2. 为什么要使用flock命令获取独占锁? 3. $(MAKE) clint是什么意思? 4. touch命令的作用是什么?
写文章

热门文章

  • make详解 13064
  • 中断的基本概念 10048
  • 8086CPU结构与功能 5393
  • 为什么执行同一个程序每次输出的变量地址是不一样的 3558
  • 8086微处理器的寄存器组织 3016

分类专栏

  • 汇编 9篇
  • 生活篇 1篇
  • 计算机系统 16篇
  • 设计模式 2篇
  • C++ 3篇
  • 链接装载与库 4篇
  • 数据库 1篇
  • 工具 4篇
  • 装机 4篇
  • C语言 5篇
  • 计算机网络 4篇
  • linux系统编程 4篇

最新评论

  • make详解

    休平之道: 谢谢学姐表情包

  • linux内核目录分析

    xuancbm: tql

  • CPU原生支持的任务切换方式

    huanyushi: 学姐加油,写的真好

  • CPU原生支持的任务切换方式

    桀溺。: 这种太生硬了,哈哈哈, 所以很正常的.

  • CPU原生支持的任务切换方式

    李兆龙的博客: 这么好的文章没人看,可惜可惜

大家在看

  • 【C++指南】inline内联函数详解 1634
  • 动态内存管理
  • 【数一线性代数】012入门 779
  • 基于ssm+vue读书会交流平台(开题报告+程序+论文+java) 627
  • 【自媒体人必备的18个素材网站2024】 891

最新文章

  • eBPF入门
  • AT&T语法
  • linux内核2.6.16版本启动分析(1)
2021年4篇
2020年19篇
2019年29篇

目录

目录

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家玻璃钢雕塑 价格徐州商场美陈策划上海抽象玻璃钢雕塑销售厂家情人节国外商场创意美陈玻璃钢雕塑气球图片贵阳创意玻璃钢雕塑酒店玻璃钢雕塑设计价位承德玻璃钢雕塑生产厂家莱芜做玻璃钢雕塑的南通玻璃钢雕塑厂家哪家好厦门玻璃钢卡通雕塑生产进口玻璃钢雕塑诚信企业成品玻璃钢雕塑摆件销售公司黑龙江步行街玻璃钢雕塑玻璃钢十二星座雕塑信阳发光玻璃钢雕塑供应商电话辽宁玻璃钢卡通雕塑圣诞报价菏泽玻璃钢形象雕塑玻璃钢雕塑深圳合肥玻璃钢仿铜麒麟雕塑黄山玻璃钢雕塑优势阜新玻璃钢雕塑制作厂家商场美陈区3d模型洛阳肖像玻璃钢卡通雕塑定做军号雕塑玻璃钢公司成品玻璃钢花盆价格岳阳湖南玻璃钢雕塑厂家哪家好海南公园小品玻璃钢雕塑海南玻璃钢雕塑工厂丰台玻璃钢雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化