makefile简单介绍

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

由于才刚接触Makefile不久,这里只能做出一些简单的介绍。

通常,我们建立一个工程,里面存放许多源文件,这时候,就有一些问题产生了。到底哪些文件先编译,哪些需要重编译,哪些根本就不需要编译(假设存在不需要编译的文件,当然,通常在一个工程中是不会出现这种状况的),甚至一些更加复杂的操作,而我们的Makefile就规定了一系列的规则来使这些操作准确无误地进行。其实我们也可以把Makefile看做是一个Shell脚本,虽然它们还是有所区别的。

我们可以来看一下Shell脚本和Makefile的区别。

1)Makefile

一个makefile由依赖关系和规则两部分内容组成。

A.依赖关系

依赖关系由一个目标和一组该目标所依赖的源文件组成。这里所说的目标就是将要创建或更新的文件,最常见的是可执行文件。

B.规则(规则用来说明怎样使用所依赖得文件来建立目标文件)

target(目标文件或可执行文件) : prerequisities(依赖文件列表,罗列生成target所需的文件或者目标)

command(执行指令,Shell命令)···

这样的规则可以减少重编译,为什么呢?假如我们存在如下的:TestA.c, TestB.c, TestC.c, TestA.h, TestB.h, TestC.h, main.c。

Makefile中为 

test : main.o TestA.o TestB.o TestC.o
g++ -o test main.o TestA.o TestB.o TestC.o
TestB.o : TestB.c TestB.h
g++ -c TestB.c
TestA.o : TestA.c TestA.h
g++ -c TestA.c
TestC.o : TestC.c TestC.h
g++ -c TestC.c 
main.o : main.c TestA.h TestB.h TestC.h
g++ -c main.c


则当我们make该文件时,输出:

g++ -c main.c

g++ -c TestA.c

g++ -c TestB.c

g++ -c TestC.c 

g++ -o test main.o TestA.o TestB.o TestC.o

执行该文件时输出:

Test  A

Test  B

Test  C

若此时我们改变文件TestA.c中的内容,让其输出Test D,重新make之后输出:

g++ -c TestA.c

g++ -o test main.o TestA.o TestB.o TestC.o

执行该文件时输出:

Test  D

Test  B

Test  C

这说明了只有当prerequisities比target“新”的时候才执行command,减少了重编译次数。

2)Shell脚本

大家都使用过批处理文件吧?从某种程度上说,Shell脚本就是批处理文件。脚本文件是一个可执行文本文件,用户在Shell提示符下所有输入内容都可以放到脚本文件内使用,也就是说,原本在Shell下需要输入的多行命令可以放到Shell脚本文件中,通过使用一个命令完成所有的工作。

3)区别

A.在Makefile中只能在target下调用Shell脚本和执行Shell命令,而其他地方则不行,但在Shell脚本中,任何地方都可以调用Shell脚本和执行Shell命令

B.在Makefile中一行代码是通过创建一个进程来执行。

C.在Shell脚本中,变量是通过在变量名前加一个$来表示,而在Makefile中,在变量名前加一个$代表Makefile变量,加两个$才代表Shell变量。

其实还有一些通配符或者其他的小区别,在这里就不介绍了。总之,Makefile写得好的话,make命令和Makefile配合使用,能给我们的项目管理带来极大的便利,除了用于管理源代码的编译之外,还用于建立手册页,同时还能将应用程序安装到指定的目录。

JAVA堆外内存dump/分析 上面0000xx是内存的地址,dump “00000000017cf000 80696 43764 43764 rw--- [ anon ]”内存块,起始地址:00007f9ccb0ca000, 结束地址:00007f9ccbdb2000。java 堆外内存dump。使用gdb dump内存。 阅读详情

相关推荐

Kconfig与Makefile简单介绍

1. Kconfig介绍与使用 来源-Kconfig介绍 背景介绍 在分析u-boot源码的时候,我发现很多文件夹下面都有一个Kconfig文件,我很好奇它是干什么用的。通过网上查阅资料,我发现它对于u-boot的配置极为重要,因此特记录下自己对kconfig的理解。 什么是kconfig Linux kernel的目录结构下一般都会存在KconfigMakefile两个文件。分布在各级目录下的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文件相关的内核配置菜单。在

MIRSTAMP的博客 1555

Makefileshell脚本区别

2、Makefile中所有以$打头的单词都会被解释成Makefile中的变量。echo $$PATH例子中的第一个${PATH}引用的是Makefile中的变量,而不是shell中的PATH环境变量,后者引用的事Shell中的PATH环境变量。可以调用shell脚本,但是Makefileshell脚本是不同的。4、在Makefile中只能在target中调用Shell脚本,其他地方是不能输出的。1、 shell中所有引用以$打头的变量其后要加{},而在Makefile中的变量是以$打头的后加()。

嵌入式C 568

用LightRAG+Ollama搭建本地知识库:从文档上传到智能问答的完整流程

本文详细介绍了如何利用LightRAG与Ollama构建企业级本地知识库,涵盖从文档预处理到智能问答的完整流程。通过实战案例展示,该方案能高效处理海量文档,实现语义搜索与知识图谱关联分析,显著提升信息检索效率。特别适合金融、医疗等领域的技术团队快速搭建智能知识管理系统。

weixin_42535461的博客 134

__gnu_cxx::__concurrence_broadcast_error错误解决方法

最近修改代码在主机编译运行正常,但是交叉编译在arm平台上运行出现下面错误: terminate called after throwing an instance of '__gnu_cxx::__concurrence_broadcast_error' what():  __gnu_cxx::__concurrence_broadcast_error 在google上搜了一通,找到了

做一个有技术追求的人 5725

gcc 4.8.5 的string问题

gcc 4.8.5的调用

lanxiaziyi的专栏 1221

'__gnu_cxx::__concurrence_broadcast_error'解决办法

本人将多线程程序交叉编译后在板上执行,发现了一个让人费解的错误。 terminate called after throwing an instance of '__gnu_cxx::__concurrence_broadcast_error'   what(): __gnu_cxx::__concurrence_broadcast_error 查了一下出

simenen的专栏 1552

Makefile简单介绍

那么 make 将把它的值视为一个由空格分隔的 Makefile 名称列表,这些 Makefile 将在其它 Makefile 之前被读取。上述 Makefile 的结果是定义一个目标 ‘target’,其前提条件是 ‘echo’ ‘built’,就好像 Makefile 包含了 ‘target: echo built’,而不是一个带有规则配方的规则。如果你想使用一个非标准的名字来命名你的 Makefile,你可以使用 -f 或 --file 选项指定 Makefile 的名字。

NickDeCodes的博客 185

Makefile简单介绍

Makefile 介绍Makefile文件的作用是告诉make工具需要如何去编译链接程序,在需要编译工程时只需要一个make命令即可,避免了每次编译都要重新输入完整命令的麻烦,大大提高了效率,也减少了出错率。make命令的规则是: - 如果这个工程没有编译过,则把所有的源文件进行编译链接 - 如果工程已经编译过,但是之后修改了其中的几个.c文件,那么只需要编译那些被修改的文件,并链接目标程

六炅的专栏 568

Makefile简单介绍

1、为什么要使用Makefile (1)工程项目中c文件太多管理不方便,因此用Makefile来做项目管理,方便编译链接过程。 (2)ubootlinux kernel本质上都是C语言的项目,都由很多个文件组成,因此都需要通过Makefile来管理。所以要分析uboot必须对Makefile有所了解。 2、简单Makefile实例 exe: gcc a.c -o exe //执行a.c的时候,直接在命令行输入make即可 3、Makefile中的一些基本概念 目标:目标顶格写,后面是冒号(冒号后面是

shark_93的博客 681

makemakefile简单介绍

博客园地址 GUN make是一种代码维护工具。 make工具会根据makefile文件定义的规则步骤,完成整个软件项目的代码维护工作。 一般用来简化编译工作,可以极大地提高软件开发地效率。 windows下一般由集成开发环境自动生成, linux下需要由我们按照其语法自己编写。一、大量代码的关系维护 大项目中源代码比较多,手工维护、编译时间长而且编译命令复杂,难以记忆及维护。 把项目维护命令及编译命令写在makefile文件中,然后再用make工具解析此文件自动代码的合理编译。 二、减少重复编译时间 在

left23333的博客 362

makefile使用的简单介绍

如何编写简单Makefile文件 为什么要使用makemakefile 在VS当中,项目管理(多文件管理),VS帮我们自动管理。 在Linux中,维护项目文件的工作,需要makemakefile来完成。 什么是make,makefile? 首先,需要明确的是,makemakefile是相互依赖的关系。make是执行依赖关系依赖方法的命令,makefile是维护该机制的文件,makefile里面保存的是项目的依赖结构。 要搞清楚依赖关系依赖方法,我们还得明晰程序的编译链接。 程序的编译链接 一

baidu_39410518的博客 191

Makefile文件简单介绍

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33798152的博客 172

linux makefile简单介绍

我们来看看linux下面的Makefile的规则: target ... : prerequisites ... command ... ... target也就是一个目标文件,可以是Object File,也可以是执行文件。 prerequisites就是,要生成那个target所需要的文件或是目标。 command也就是make需要执行的命令。(任意的Shell命令) 这是一个

code change the world 994

Linux Makefile介绍以及简单使用

一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。Makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

qq_45030264的博客 975

Makefile 简单介绍

Makefile 作用:实现“自动化编译” , 只需要一个 make 命令,整个工程完全自动编译,提高了软件开发的效率。 1 规则 文件命名: makefile 或者 Makefile Makefile 规则 target ...: depend ... shell command ... 一个 Makefile 文件有一条或者多条规则 Makefile 中的其它规则一般都是为第一条规则服务的 2 工作原理 命令在执行之前,需要先检查规则中的依赖是否存在 如果存在,

liusscsdn的博客 461

automake 生成 makefile 简单介绍

本文转自:http://www.ibm.com,作者:杨 小华  苏 春艳本文介绍了在 linux 系统中,通过 Gnu autoconf automake 生成 Makefile 的方法。主要探讨了生成 Makefile 的来龙去脉及其机理,接着详细介绍了配置 Configure.in 的方法及其规则。引子无论是在Linux还是在Unix环境中,make都是一个非常重要的

flyingship23的专栏 695
上一篇: OSI模型
下一篇: TCP/IP体系结构
simenen
博客等级 码龄14年 4粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值