【Linux】makefile 使用学习,小白入门~

Linux嵌入式学习之Ubuntu入门(四)Makefile 在Linux下,借助例如gcc编译器编译时,如果有很多的文件:1、如果工程没有编译过,那么工程中的所有.c 文件都要被编译并且链接成可执行程序。2、如果工程中只有个别 C 文件被修改了,那么只编译这些被修改的 C 文件即可。3、如果工程的头文件被修改了,那么我们需要编译所有引用这个头文件的 C 文件,并且链接成可执行文件。gcc [选项] [文件名字]主要选项如下:-c: 只编译不链接为可执行文件,编译器将输入的.c 文件编译为.o 的目标文件。 阅读详情

Title:makefile 学习

0 吐槽

发现自己一年没更新博客了,掏出存货来刷一下存在感 ( ̄▽ ̄)“…
主要原因 是:① 忙于实习;② 懒于撰稿;③ 完美主义越来越强,note回看就修订觉得发不出手、过半个月回看又修订还是发不出手,结果懒得发了… ( ̄▽ ̄)”
先随手发;之后本地修订后,再回来改线上的吧~

1 Basic Concept

1.1 是什么

make是GNU里的一个utility,可实现方便的自动化编译,在unix和linix都可以写;
首先要写一个文本叫 makefile,然后调用命令make,terminal即会按makefile的内容对工程或源文件进行 re-compile or link;

makefile作用是对bash等命令进行方便地一键重用,故可以用makefile进行compile、link、simulation、执行程序等都可以,反正要执行什么 bash 指令自定义写进去就完事儿了;

makefile中写的内容,表示的是 how、when对什么文件进行什么操作,从而让我们后续可以方便的 “一键remake”。

1.2 OS概念复习

compile 和 link 的概念
  1. 源码compile(检查语法,有函数声明即可通过)后得到中间文件(windows是.obj、UNIX是.o);
  2. 对中间文件进行打包得到库文件(windows是.lib、UNIX是.a Archive File);
  3. 把它们link(合成一坨一个可执行文件)——链接函数和全局变量等,找不到函数实现就会出现link error——得到可执行文件(windows是.exe、UNIX无后缀);
windows下的make

一般默认 make是Unix OS下;

若是windows下,得看IDE——Delphi是用make,VC++用nmake;
windows下要想make就得下载MinGW编译器了.

1.3 怎么用make

  • ①terminal中敲 make,OS会自动按顺序寻找文件 GNUmakefile、makefile、Makefile;

  • ②也可手动指定执行makefile文件(很少用,一般直接 make )

    make -f <...makefile>

1.4 makefile 与 shell

  • makefile和shell的区别

    作用:shell是为了重用terminal内的命令服务的,是系统程序员与OS内核的交互接口;makefile是用于工程compile/link用的;makefile内可写shell命令、调用shell脚本,如:+ ./xxx.sh;

    写法区别:

    1. shell内 =号不允许有空格,makefile内 =号空格无碍;
    2. shell内开头要写 #!/bin/bash,后缀名是.sh;
    3. shell内是自上而下执行,有数组、循环等;makefile内执行shell命令是一行独立一个进程,若想一个进程统一执行,得在末尾用 \ 表同一行。
    4. shell内通配符:*;makefile内通配符:%;
    5. shell内变量用 {},命令串用 ();makefile中访问变量用 $() 或 ${} 都行;
  • shell与cshell的区别

    linux下提供了很多种shell: (简称sh)、C-Shelll(简称csh)、Korn Shell(简称ksh)和Bourne Again Shell (简称bash)。

    1. Bourne Shell,文件后缀 .sh,是Unix的默认shell,也是其他shell的基础;性能好,但用户交互低;
    2. C shell,文件后缀 .csh,语法类似C,提供了 .sh 没有的用户交互功能——命令补全、命令别名等;与 .sh 不兼容;
    3. Korn Shell:文件后缀 .ksh,结合了 .sh 和 .csh的优点,并向下兼容了 .sh;
    4. Bourne Again Shell,即bash,是Linux的默认shell,结合了以上 .sh 、 .csh、.ksh 的优点,并向下兼容了 .sh;最强!

2 语法

2.1 基本格式⭐️

目标target:   所需prerequisites
(TAB) command (任意的Shell命令)
	
label:
(TAB) command...
  1. 要注意 =号的空格无碍;tab很关键,和python一样;
  2. 用 make 触发执行makefile后,make会检查 各prerequisite的更新日期,若比target新,就重新执行此句的命令。
  3. makefile会把第一个target作为编译目标,然后逐层迭代的判断是是否需要更新所需的 prerequisites. 其他没被牵扯到的target或者label,需要自己调用 make label 来单独执行。
  4. 若target不是实体存在的文件而是个虚名,那它称呼为**label**,label后面的prerequisites不用加文件名,因为target是个label的话压根就没有实体文件给你比日期,写文件也没啥用;
    一般label后面的prerequisites也写label;那此时若make target就会先去make prerequisites里的label,嵌套执行,就当成函数好了.
  5. .o 文件与自身相关的 .h、.c 文件的prerequisites可省略,因为会自动补充;
  6. 养成好习惯,自己写一个 clean label,用于删除上一次调用make后产生的所有中间、执行文件,日后用 make clean 就能起到复位的作用;
    • clean label内,务必用 rm -rf 而不是 rm,不然报错一句,后续clean都不执行了!

2.2 举个例子Case ⭐️

  • makefile的触发条件

    ① prerequisite比target要新;

    ② 或者 prerequisite不存在;

    所以,若target的A不是实物,永远不会生成,则此语句每次make都 必会被调用。

    B = ?
    C = ?
    	# B和C是具体的文件,A只是抽象的程序tag无对应实体文件
    A: B C
    	B -o C	#和A没关系,A永远不会生成,故此语句必执行
    

    也可以有多个抽象的程序块,如下:

    all: do1 do2 do3	# 四个label
    
    do1: A B C
    	...balabala...
    do2: E F
    	...balabala...
    do3:
    	...balabala...
    
  • makefile中 .PHONY 的学习

    考虑以上makefile的case,会出现这样的问题:
    若在写完makefile后,本地恰巧出现了个文件或文件夹的名称也叫做 A ! 那按makefile的规则,由于A被检测到文件存在,且prerequisite B、C并不是比 A 要新的话,此行makefile就不会执行了!

    总结:makefile中的target字段本该是无实体文件的抽象label,却因本地存在同名文件/文件夹,使此行makefile无法如意执行。

    Solution:在A前面加上 .PHONY (可以理解为关键字),声明此A就是label、不是实体文件,别去检索当前路径下是否存在同名文件啦!之后,即使makefile目录下有同名文件A,makefile也会按label进行处理此target.

    B = ?
    C = ?
    
    .PHNONY:  A 	#声明A是phony抽象的
    A: B C
    	B -o C	#和A没关系,A永远不会生成,故此语句必执行
    

    .PHONY 只是一个声明,不会影响后续label的执行的。

2.3 细节的其他makefile语法

  • target和prerequisite的数量

    至少一个target:target是一个东西或事件、自定义函数名。最好加个注释说明一下是啥;

    可以0~n个prerequisite:prerequisite是前置文件,可用通配符 *;

  • 行注释 用#;

  • 行续写,于行尾 用 / , 表多行代码用一个进程执行;

    makefile内写的程序默认一行一个进程执行,故需要将程序串行执行,得自己加 /;

    注:注释也可用 / 进行续写;使用 / 后会读取“空行”,故下一行别接注释!

  • 宏定义 Macro define

    • 定义: 等号=, pi=3.14, 可嵌套,大小敏感;
    • 使用: $(宏名)
    • 常用系统宏:
      • $@,当前target
      • $<,第一个条件的名字
      • $?, 所有条件中 比 当前target更newer的 民名字
      • $^, 所有条件的名字
      • $(MAKE),就是预设的 make命令
  • define

    即多行版本的宏定义

    define 宏名
    	...
    	...
    endef
    
  • include

    导入别的makefile(类似导入库),文件名语法可用正则表达和shell.

    若多个导入的makefile库内,出现 target冲突,取最后一行定义为准

  • 正则表达式,

    如:通配符等—— *, [], ?,@, @好像是让系统回话功能闭嘴,干净。

  • Reference

    此博客不错:Makefile教程(绝对经典,所有问题看这一篇足够了)—— GUYUEZHICHENG

【DRAM存储器六十五】DDR5介绍--训练相关之MPC、Read Training Pattern、Read Preamble Training Mode 简述DDR5 MPC操作和读训练时颗粒输出pattern的配置 阅读详情

相关推荐

三极管NPN与PNP的工作原理及快速识别技巧

本文深入浅出地解析了三极管NPN与PNP的核心工作原理。通过“水龙头”比喻,阐明其以小电流控制大电流的放大与开关本质。文章重点对比了NPN与PNP在电流方向、电位关系和控制逻辑上的根本区别,并提供了快速识别技巧与实用的选型、应用指南,帮助电子爱好者与工程师快速掌握这两种基础元件的关键知识。

neovim7hacker的博客 452

makefile的调试器remake

remake --debugger即可开始调试 转载于:https://www.cnblogs.com/dakewei/p/10762822.html

weixin_30707875的博客 1005

从实验室到生产线:Qwen3-Omni后训练技术在实际业务中的落地挑战

本文探讨了Qwen3-Omni后训练技术在实际业务中的落地挑战,重点分析了多模态AI在工业应用中的关键问题与解决方案。通过金融风控、跨境电商等场景案例,揭示了通用模型与垂直需求的矛盾,并提供了知识蒸馏、语音合成优化等实战经验,助力企业实现技术到业务的转化。

weixin_29035147的博客 265

remake的使用

SYNOPSIS remake [OPTION]... [TARGET]... OPTIONS -c, --search-parent 如果一个makefile或者终极目标在当前目录无法找到,remake将会在父目录搜索Makefile.直到找到符合条件的最近的父目录中的Makefile 在这方面,除了-c无需指定目录,选项-c是很类似-C的 -! | –post-mortem: 在出现错误时进入调试器。这与另一个选项相同:–debugger –debugger-stop = error –profil

HideOnLie的博客 6611

解锁RK3588视觉潜能:RGA硬件加速库实战指南

本文深入探讨了如何利用RK3588芯片内置的RGA硬件加速库,解决视觉应用中图像预处理的性能瓶颈。通过实战指南,详细介绍了RGA库在YUV转RGB、图像缩放等核心操作上的应用,相比CPU软处理可大幅降低延迟与CPU占用,从而充分释放RK3588的NPU算力,构建高效的AI视觉预处理流水线。

zeta9的博客 669

单细胞 | pySCENIC·转录因子分析(二)

接上一篇,pySCENIC分析完之后就可以进行可视化了,个人认为最重要的有三个图:rss点图,rank图,转录因子表达水平热图,3个图结合着看。3.可视化rank图,可以自己改一下plotRSS_oneSet参数让图更好看一点。4. regulon表达水平热图,转录因子表达水平同理,得到的图类似只是输入不一样。2.可视化点图:寻找cluster特异性转录因子。1.loom文件读入R,提取数据。

生信练习生 4283

GNU Makefile--调试器remake

remake调试器 国外的开发人员对GNU Make进行了一定程度上的重构,增加了Makefile的动态调试功能,命名为remake。调试器的操作界面类似于GDB的命令行,开发者为其编写了详细的文档,有兴趣的可以参考。GNU Make自身也支持若干个调试选项,但其调试功能比较有限,remake的作者对此很不满。不过,remake工具对递归的调试(即一个Makefile脚本中调用$(MAKE)执行新的Makefile)支持不够完善,对单个Makefile的调试功能则相对完整。本文记录了笔者通过remake工具

yeholmes的专栏 1802

Burp Suite手工验证CORS漏洞的四步闭环法

CORS(跨域资源共享)是Web应用实现跨域通信的基础机制,其安全本质在于服务端对Origin头的校验逻辑与响应头组合的语义一致性。当服务端错误地返回Access-Control-Allow-Origin: *并配合Access-Control-Allow-Credentials: true,或采用弱校验(如字符串包含匹配)时,将导致敏感数据泄露与凭据劫持风险。该漏洞难以被自动化扫描器发现,因其依赖请求上下文、认证状态及动态策略判断。Burp Suite作为核心工具,需通过构造跨域请求、捕获预检响应、交叉验

weixin_30596343的博客 512

多层makefile嵌套,Remake单步调试不能进入调用的makefile的解决方案

近期学习makefile时,对于某些逻辑关系理不清,过程比较痛苦。老师推荐使用remake,可以进行单步调试,记录下学习过程,本人操作系统是ubuntu16.04。 1.安装remake git下载调试工具remake,参考installation说明完成工具安装,此处使用的是源码安装,installation中有对不同系统的安装说明,根据实际情况进行安装。 确定安装目录,并下载remake git clone https://github.com/rocky/remake.git 安装依赖 s

UItogether的博客 1089

DeepSeek高阶应用:DeepSeek+Coze构建智能文献综述与趋势分析自动化系统

本文详细介绍了如何利用DeepSeek与Coze构建智能文献综述与趋势分析自动化系统。通过DeepSeek的深度语义理解和结构化信息提取能力,结合Coze的可视化工作流编排,实现学术论文的自动解析、分类整理与知识入库。该系统能7x24小时自动追踪领域前沿,将研究人员从繁琐的文献处理中解放出来,专注于更高层次的思考与创新。

weixin_29050271的博客 179

Leads、SDR、MQL、SQL、L2C术语概念,线索创建与清洗、线索分级模型、线索流转策略、线索的统计与分析

CRM中的“Leads”是什么?笔者在文中不仅较为全面地介绍了相关术语概念,还分析了线索的创建与清洗、线索的分级模型、线索流转策略以及线索的统计与分析。

盼盼学士 5954

Makefile的使用

Makefile规则 Makefile语法::通配符 、假想目标: .PHONY、变量 Makefile函数:foreach、filter/filter-out、Wildcard函数、patsubst函数 Makefile使用实例 通用Makefile编写

发如雪 4715

数据分析案例-电影数据可视化分析

数据介绍数据为2011-2021电影数据可视化分析首先导入本次项目需要的包和数据 数据预处理 可视化

m0_64336780的博客 2万+

Linux下Makefile的使用

本文介绍了最简单的Makefile创建方法及其使用 介绍了文件组织形式、make的工作流程、Makefile的手动编写、Makefile的变量使用、用户自定义变量、预定义变量、自动变量、Makefile的包含和嵌套、Makefile的自动生成、Autotools工具、configure文件的生成以及介绍了用脚本辅助编译

@吹灭小山河的博客 5854

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Linux学习之makefile

本文相信介绍了Linux中makefile的理论并且每一步都有实操,配有多张图片。我将带你一步一步优化你写的makefile,中间没有一点跳跃,保证你能听一遍就明白。还不赶紧点进来学习提升自己吧!!!

yourgrandfather_的博客 1457

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Linux 中 Makefile 的简单使用

简要的写一下Linux中的Makefile的使用,然后用Makefile文件来编译一个小型的自己写的 FTP server。当make命令执行的时候,需要一个makefile文件,来告诉make命令该怎么去编译和链接程序,注意,make并不真正的去进行编译,它只是调用执行gcc这种编译命令而已。Makefile 可以简单的认为是一个工程文件的编译规则,描述了整个工程的编译和链接等规则。其中包含了那些文件需要编译,那些文件不需要编译,那些文件需要先编译,那些文件需要后编译,那些文件需要重建等等。

顺其自然~专栏 6858

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Linux Makefile入门总结

快速入门Makefile,通俗易懂;Makefile链接多路径编译;Makefile链接第三方库编译!

cpp_learner的博客 3506

Linux入门篇学习——makefile 基本语法和Makefile 常用函数

本文介绍了Makefile的基本语法和常用函数。主要内容包括:1. 基本语法部分讲解了vim缩进设置、Makefile语法格式、伪目标(.PHONY)以及变量的四种赋值方式(=、:=、?=、+=)和自动化变量($<、$@、$^);2. 常用函数部分详细说明了wildcard(目录展开)、notdir(去掉路径)、dir(取出目录)、patsubst(替换后缀)和foreach(循环执行)五个核心函数的使用方法。文章通过具体示例演示了如何运用这些语法和函数来编写高效的Makefile,特别强调了在复杂项

2301_80366509的博客 1312

【Linux】Make和Makefile快速入门

不知道大家还记得我们写的进度条,里面就有们的makefile,在哪里面我们没有讲解,拿到这里我们深度解剖,也可以再次回顾我们的进度条,那我们话不多说,进入我们今天的主题----【Linux】Make和Makefile快速入门🤗🤗。⭐浅谈Make和Makefile什么是makelinux中make是一个构建工具,用于自动化编译和构建软件项目。它的作用是允许开发人员管理和维护复杂的软件项目,自动化编译过程并生成可执行文件。软件项目通常由多个源代码文件和依赖项组成。

AAlykk的博客 1348

【makefile入门】makefile选项和makefile.buil

学习makefile的常用选项,并通过一个案例来学习makefile.build

jk_lovers的博客 2077

[Linux]Makefile入门

本文对make/makefile重要规则进行简要阐述,包含makefile语法规则,以及解释make命令如何根据makefile文件生成目标文件,makefile文件中如何对变量赋值,以及makefile常用特殊变量含义,如何使用变量,makefile中伪目标作用,嵌套执行makefile

yuehuazyc的博客 1010

Makefile 入门教程

Makefile 定义了软件开发过程中,项目工程编译链、链接的方法和规则。由 IDE 自动生成或者开发者手动书写。Unix(MAC OS、Solaris)和Linux(Red Hat、Ubuntu、SUSE)系统下由 make 命令调用当前目录下的 Makefile 文件,实现项目工程的自动化编译。Windows 环境开发人员,可能并未听说过 Makefile,但是时时刻刻在使用 Makefile 来完成程序的编译,因为开发者并不需要手动编写 Makefile,而是通过 IDE 自动生成。

Doublelv 的博客专栏。 9152

linux makefile入门简介

皓哥写了一系列的makefile文章后, 就被大家奉为经典。 我自然无法与皓哥相比, 所以仅仅写一下自己对makefile的理解, 自娱自乐, 权当是个人笔记吧。 Windows下的开发, 用IDE, 有所谓的工程的概念, 写好代码,编译、连接运行, 然后看结果就行了。 在这个过程中, IDE直接为我们写好了makefile, 我们啥都不用担心。但在Linux中, 这些ma

认知 行动 坚持 7863

Linux学习之Makefile和shell

基本语法:目标、依赖、命令。变量:使用变量简化 Makefile。自动变量:使用$@$^$

zhaozhaoxiyang的博客 1596

【Linux】Makefile

Makefile是一个包含了一系列指令的文件,这些指令定义了如何编译和链接程序。Makefile被make命令使用,make是一个构建自动化工具,它根据Makefile中定义的规则来决定哪些文件需要重新编译。

Tesseract_9527的博客 1451

Linux-GCC介绍+入门级Makefile使用

Linux-GCC介绍+入门级Makefile使用

在嵌入式嵌入式领域奋斗的程序猿的博客 2027
上一篇: 【心随意动】研一春季下学期小结
下一篇: 【体系结构】IEEE754浮点数标准学习与机器码表示总结
仰天倀笑
博客等级 码龄10年 313粉丝 124原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值