【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

从课堂笔记到动手实践:用Multisim仿真高频谐振功放(丙类)的完整流程 本文详细介绍了使用Multisim仿真高频谐振功放(丙类)的完整流程,从仿真环境准备到电路搭建、偏置网络设计、信号注入与波形观测,再到效率优化与性能验证。通过14个关键操作步骤,帮助读者将高频电子线路的理论知识转化为动手实践,深入理解丙类功放的非线性工作状态和效率优化技巧。 阅读详情

相关推荐

C++实战:基于ONNX Runtime与OpenCV部署XFeat图像匹配模型

本文详细介绍了在C++环境中,利用ONNX Runtime与OpenCV高效部署XFeat图像匹配模型的完整流程。内容涵盖环境搭建、模型转换、核心代码封装及可视化实现,旨在帮助开发者将这一先进的深度学习模型集成到对性能要求苛刻的工业或嵌入式应用中,实现鲁棒且快速的特征匹配。

gpu4optimizer的博客 522

makefile的调试器remake

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

weixin_30707875的博客 1005

汽车TSN时间敏感网络测试技术与探索系列讲座4 -TSN802.1AS同步要求及验证方法

TSN网络各设备类型同步性能要求是什么?各类设备的测试组网及测试内容。也将通过演示来展示相关测试结果,及如何解决上述的测试关注点。

weixin_43903833的博客 761

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

AI智能体丨使用Coze一键生成中式养生视频,39 条作品涨粉 37.9 万!(附保姆级教程)

本文介绍如何利用扣子(Coze)AI智能体工作流高效制作中式养生短视频。该方案通过AI自动生成养生文案、古风插画素材、语音合成和视频剪辑,将传统制作流程从2-3小时缩短至1-2分钟。工作流包含文案创作、音频生成、图片素材制作和视频合成四大模块,采用大模型处理各环节内容,最终输出可直接导入剪映的草稿文件。特别适合希望快速批量制作文化氛围感强、兼具干货与视觉效果的养生内容创作者,效率提升近百倍。

李同学Lino的博客 3027

GNU Makefile--调试器remake

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

yeholmes的专栏 1802

14、脑肿瘤复发预测与转移瘤跟踪的自动化方法

本文介绍两种脑肿瘤相关自动化方法:一种用于预测胶质瘤切除术后的肿瘤复发位置,结合图像配准、静态模型和动态模拟模型,利用患者的DTI数据进行预测;另一种用于在纵向扫描中跟踪转移性脑肿瘤,通过联合求解配准参数估计和图像变化标记问题,提高肿瘤跟踪的准确性和效率。文章同时分析了两种方法的优势与挑战,并提出了未来研究方向,旨在为脑肿瘤的诊断和治疗提供更可靠的工具。

defi6farmer的博客 115

多层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

高通SDX35:SGMII接口PHY RTL8211FSI-CG驱动适配

高通SDX35 RTL8211F SGMII

不秃头的程序猿Gabriel的博客 785

SIMULINK开发项目实例 1000 例专栏之第847例--基于飞行控制与稳定性的场景实例:多旋翼无人机在风扰动下的稳定性分析

本文介绍了使用Simulink进行多旋翼无人机风扰动稳定性分析的完整流程。首先建立包含动力学模型、控制系统和环境模拟三大模块的仿真系统,其中动力学模型基于牛顿-欧拉方程,控制系统采用PID调节器。重点展示了MATLAB函数实现的风扰动模型和姿态控制算法,通过设置输入信号和输出显示模块完成闭环仿真。最后通过多次风速条件下的仿真测试评估控制系统的抗干扰能力和稳定性表现,为无人机控制系统设计提供了有效的仿真验证方法。

xiaoheshang_123的博客 322

makefile 的调试. remake

remake --tasks //列出Makefile 的目标,该目录会有命令执行来生成. --targets 是更详细的目标 remake --trace //跟踪维护的目标, 每一个运行的命令将会显示 remake --profile //列出构建过程中各部分消耗的时间 remake --debugger 进入debugger 调试状态 可以单步,断点,检查变量,调用堆栈,查看目标等.

hjjdebug的专栏 1681

基于STM32、HAL库的RN8209D电能计量芯片驱动程序设计

/ 假设电压互感器变比为220V:0.5V,电流互感器变比为20A:5mA。// 电压ADC原始值。// 电流ADC原始值。// 有功功率(W)// 电能(kWh)

corlin6688的博客 469

Linux下Makefile的使用

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

@吹灭小山河的博客 5854

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

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

Linux学习之makefile

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

yourgrandfather_的博客 1457

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Linux 中 Makefile 的简单使用

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

顺其自然~专栏 6858

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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的博客 1313

【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 的博客专栏。 9153

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、付费专栏及课程。

余额充值