make工具

news2024/11/25 19:56:16

1、什么是make?

make是个命令,是个可执行程序,是个工具,用来解析Makefile文件的命令,这个命令存放在/usr/bin/目录下

-rwxr-xr-x 1 root root 250K  2月 15  2022 make
-rwxr-xr-x 1 root root 4.8K  2月 15  2022 make-first-existing-target        //Perl脚本编写的程序会由make命令触发执行,用来检测文件是否被修改,没有修改跳过编译

Debian系安装make工具:sudo apt install make

2、什么是makefile?

Makefile是个文件,这个文件中描述了咱们程序的编译规则,咱们执行make命令的时候,make命令会在当前目录下寻找Makefile文件,根据Makefile文件里的规则,编译咱们的程序。

        注意Makefile文件是咱们程序员根据自己的程序,编写的编译规则文件。

3、make的主要好处

一、大量代码的关系维护,大项目中源代码比较多,手工维护、编译时间比较长而且编译命令比较复杂,难以记忆和维护,把代码维护命令和编译命令写在Makefile文件中,然后再用make工具解析编好规则的Makefile文件,自动执行相应命令,可实现代码的合理编译。

二、减少重复编译时间,在改动其中一个文件的时候,能判断哪些文件被修改过,可以只对该文件进行重新编译,然后重新链接所有的目标文件,节省编译时间。

4、一张图解释:make和:Makefile关系

5、Makefile的编写语法规则

 目标:依赖文件列表

        命令列表

1、目标:通常是要产生的文件名称,目标可以是可执行文件或其他object文件,也可是一个动作的名称

2、依赖文件列表:由多个依赖文件组成,每个依赖文件是用来输入而产生目标的文件,一个目标通常有几个依赖文件(也可以没有)

3、命令列表:由多个命令组成(也可以没有),代表make执行的动作,注意一个规则可以包含多个命令,存在多个命令时,每个命令占一行

举例:将gcc -o hello main.c hello.c hi.c good.c编写成Makefile内容

Makefile文件内容:

main:main.c hello.c hi.c good.c

        gcc -o main main.c hello.c hi.c good.c

clean:

        rm main

5.1、Makefile变量
5.1.1、Makefile变量

Makefile变量类似C语言的宏Makefile被make工具解析时,其中的变量会被展开。变量的作用:保存文件名列表,保存文件目录列表保存编译器名,保存编译参数,保存编译输出。

Makefile变量分为三种:系统环境变量、自定义变量、预定义变量

系统环境变量:make工具解析Makefile前,读取系统环境变量并设置为Makefile的变量

自定义变量:在Makefile文件中定义的变量,make工具传给Makefile的变量都是自定义变量

预定义变量:自动变量,都是设置好的变量(可以理解为规则)

5.1.2、Makefile变量编写规则

变量名=变量值        引用变量:${变量名}       

注意:

        1、注意Makefile的变量名字允许以数字开头

        2、变量区分大小写

        3、变量通常在Makefile文件的头部定义

        4、变量可在Makefile的任何地方使用

5.1.3、预定义变量

Makefile中我们通常只需要定义自定义变量和重新定义系统环境变量,而不需要定义预定义变量。

预定义变量通常是通用的,像正则表达式的元字符,具有特殊的含义。

$@        # 目标名

$<        # 依赖文件列表的第一个文件

$^        # 依赖文件列表中去除重复文件的部分

%        # 通配符

AR        # 归档维护程序的程序名,默认值为ar

ARFLAGS        # 归档维护程序的选项

AS        # 汇编程序的程序名,默认值为as

ASFLAGS        # 汇编程序的选项

CC        # C编译器的名称,默认为cc

CFLAGS        # C编译器的选项

CPP        # C预编译器的名称,默认值为$(CC) -E

CPPFLAGS        # C预编译器的选项

CXX        # C++编译器的名称,默认为g++

CXXFLAGS        # c++编译器的选项

6、make命令格式

make [-f file] [targets] [target] ...

1、通常我们把Makefile文件编写好规则,直接敲make,make默认从工作目录中寻找名为GNUmakefile或makefile或Makefile的文件内容的第一个目标(也有人称规则)进行解析编译。而 -f选项可以指定以上名字以外的文件作为Makefile输入文件。

2、[target]:若使用make命令时没有指定目标,则make工具默认会实现Makefile文件内的第一个目标,然后退出。若指定了目标,目标可以是一个或多个,多个目标之间默认用空格隔开。

7、makefile案例

源代码目录结构

.
├── main.c
├── Makefile
├── myfunc.c
└── myfunc.h

0 directories, 4 files

其中除Makefile以外的文件,我写在上一章csdn博文,参考gcc的编译C语言的过程-CSDN博客

7.1、简单级别

touch创建Makefile文件,写入如下内容

Makefile

my_execfile:main.o myfunc.o
        gcc -o my_execfile main.o myfunc.o
main.o:main.s
        gcc -c main.s -o main.o
my_func.o:myfunc.s
        gcc -c myfunc.s -o myfunc.o
main.s:main.i
        gcc -S main.i -o main.s
my_func.s:myfunc.i
        gcc -S myfunc.i -o myfunc.s
main.i:main.c
        gcc -E main.c -o main.i
myfunc.i:myfunc.c
        gcc -E myfunc.c -o myfunc.i
clean:
        rm my_execfile *.i *.s *.o

这里我把上一章的预处理、编译、汇编、链接的产物和过程集中写在Makefile文件中,并使用clean命令规则清理临时产物包括最终的可执行文件my_execfile。通过简单的把以上步骤汇总在Makefile文件中,只需要敲make就可以输出所有临时产物包括可执行文件,敲make clean可以清理所有中间产物和可执行文件,这对于代码维护很方便,不仅简洁美观,编译也省时。

效果

输出所有中间产物:*.i *.s *.o和可执行文件my_execfile

清理所有产物

7.2、普通级别

 Makefile

  1 #自定义变量
  2 EXEC=my_execfile        #我们的最终想要的可执行文件
  3 CC=gcc  #这里对gcc编译器也定义变量,是因为Makefile可以处理多种编译器的规则
  4 OBJ=main.o myfunc.o     #我们的目标文件
  5 OBJ1=main.o
  6 OBJ2=myfunc.o
  7 OBJ3=main.s
  8 OBJ4=myfunc.s
  9 OBJ5=main.i
 10 OBJ6=myfunc.i
 11 SOUR=main.c
 12 SOUR1=myfunc.c
 13 FLAGS=-Wall     # 这里输出gcc编译的所有warning和error
 14
 15 $(EXEC):$(OBJ)
 16         $(CC) -o $(EXEC) $(OBJ)
 17 $(OBJ1):$(OBJ3)
 18         $(CC) -c $(OBJ3) -o $(OBJ1) $(FLAGS)
 19 $(OBJ2):$(OBJ4)
 20         $(CC) -c $(OBJ4) -o $(OBJ2) $(FLAGS)
 21 $(OBJ3):$(OBJ5)
 22         $(CC) -S $(OBJ5) -o $(OBJ3) $(FLAGS)
 23 $(OBJ4):$(OBJ6)
 24         $(CC) -S $(OBJ6) -o $(OBJ4) $(FLAGS)
 25 $(OBJ5):$(SOUR)
 26         $(CC) -E $(SOUR) -o $(OBJ5) $(FLAGS)
 27 $(OBJ6):$(SOUR1)
 28         $(CC) -E $(SOUR1) -o $(OBJ6) $(FLAGS)
 29 clean:
 30         rm $(EXEC) $(OBJ5) $(OBJ6) $(OBJ3) $(OBJ4) $(OBJ)

        相对于简单处理编写Makefile文件的工作,这里我把部分编译命令通过变量的形式替换,只需要修改2~12行的数据名称,gcc的四个编译过程就可以被执行输出。clean命令进一步的缩小删除范围,可以精准到具体要删除的文件,防止其他非该Makefile的输出产物被删除。

效果

输出所有产物

清理所有产物

 7.3、升级

Makefile

# 自定义变量
EXEC=my_execfile       # 最终的可执行文件名
OBJ=main.o myfunc.o    # 目标文件
CC=gcc                 # 编译器
FLAGS=-Wall            # 编译选项,输出所有警告和错误信息

# 生成最终可执行文件
$(EXEC): $(OBJ)
        $(CC) -o $@ $^ $(FLAGS)

# 从汇编文件生成目标文件
%.o: %.s
        $(CC) -c $< -o $@ $(FLAGS)

# 从汇编文件生成汇编代码文件
%.s: %.i
        $(CC) -S $< -o $@ $(FLAGS)

# 从预处理文件生成汇编文件
%.i: %.c
        $(CC) -E $< -o $@ $(FLAGS)

# 清理生成的文件
clean:
        rm -f $(EXEC) $(OBJ) $(OBJ:.o=.s) $(OBJ:.o=.i)

# 生成所有中间文件的伪目标
all: $(OBJ:.o=.s) $(OBJ:.o=.i)

# 默认的伪目标
.PHONY: all clean

使用预定义变量和自定义变量结合,并加额外的伪目标以生成所有的中间产物和清理所有的中间产物,使用变量替换技巧将$(OBJ)的.o替换为其他中间产物,并使用.PHONY声明all和clean为伪目标,防止出现同名文件而产生歧义。

效果

输出所有产物

 清理所有产物

8、小结

实际上,中间产物并不是我们最终需要的目标文件,我们需要可执行文件文件就可以了。希望以上步骤对于了解make的编译原理有所帮助。

# 自定义变量
EXEC=my_execfile       # 最终的可执行文件名
OBJ=main.c myfunc.c    # 目标文件
CC=gcc                 # 编译器
FLAGS=-Wall            # 编译选项,输出所有警告和错误信息

# 生成最终可执行文件
$(EXEC): $(OBJ)
        $(CC) -o $@ $^ $(FLAGS)

# 清理生成的文件
clean:
        rm $(EXEC)
# 默认的伪目标
.PHONY: clean

效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1903767.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图片高效管理神器,随机高度切割,一键生成灰色图片,个性化处理随心所欲

在数字化时代&#xff0c;图片已成为我们生活和工作中不可或缺的一部分。然而&#xff0c;面对海量的图片资源&#xff0c;如何高效管理、快速处理&#xff0c;成为了许多人头疼的问题。今天&#xff0c;我们为您带来了一款全新的图片高效管理神器_——首助编辑高手&#xff0c…

【全面介绍下如何使用Zoom视频会议软件!】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

Halcon 背景网格产品刮伤缺陷检测

* 关闭窗口 dev_close_window ()*关闭程序计数器,图形变量更新,窗口图形更新 dev_update_off ()*设置图像路径 Path : lcd/mura_defects_blur_*读取一张图像 read_image (Image, Path 01)*获取图像大小 get_image_size (Image, Width, Height)*创建一个新窗体 dev_open_window…

昇思25天学习打卡营第13天 | LLM原理和实践:文本解码原理--以MindNLP为例

1. 文本解码原理--以MindNLP为例 1.1 自回归语言模型 根据前文预测下一个单词 一个文本序列的概率分布可以分解为每个词基于其上文的条件概率的乘积 W 0 W_0 W0​:初始上下文单词序列 t t t: 时间步 当生成EOS标签时&#xff0c;停止生成。 MindNLP/huggingface Transfor…

NewStarCTF2023-Misc

目录 week1 CyberChefs Secret 机密图片 流量&#xff01;鲨鱼&#xff01; 压缩包们 空白格 隐秘的眼睛 week2 新建Word文档 永不消逝的电波 1-序章 base! WebShell的利用 Jvav week3 阳光开朗大男孩 大怨种 2-分析 键盘侠 滴滴滴 week4 通大残 Nmap 依…

Unity AssetsBundle 详解

文章目录 1.AssetBundle 概念2.AssetBundle 优势3.AssetBundle 特性4.AssetBundle 使用流程4.1 分组4.2 打包4.3 加载包4.4 加载资源4.5 卸载资源 5.AssetBundleManifest6.AssetBundle的内存占用7.AB包资源加密 1.AssetBundle 概念 AssetBundle又称AB包&#xff0c;是Unity提供…

Python视觉轨迹几何惯性单元超维计算结构算法

&#x1f3af;要点 &#x1f3af;视觉轨迹几何惯性单元超维计算结构算法 | &#x1f3af;超维计算结构视觉场景理解 | &#x1f3af;超维计算结构算法解瑞文矩阵 | &#x1f3af;超维矢量计算递归神经算法 &#x1f36a;语言内容分比 &#x1f347;Python蒙特卡罗惯性导航 蒙…

【漏洞复现】宏景eHR LoadOtherTreeServlet SQL注入漏洞

0x01 产品简介 宏景eHR人力资源管理软件是一款人力资源管理与数字化应用相融合&#xff0c;满足动态化、协同化、流程化、战略化需求的软件。 0x02 漏洞概述 宏景eHR LoadOtherTreeServlet接口处存在SQL注入漏洞&#xff0c;未经身份验证的远程攻击者除了可以利用 SQL 注入漏…

[Multi-Modal] MDETR 论文及代码学习笔记

代码地址&#xff1a;https://github.com/ashkamath/mdetr 论文地址&#xff1a;https://arxiv.org/abs/2104.12763 多模态推理系统依靠预先训练的目标检测器从图像中提取感兴趣区域&#xff08;边界框包围区域&#xff09;。然而&#xff0c;这个关键模块通常被用作黑匣子&…

MySQL高级----详细介绍MySQL中的锁

概述 锁是计算机协调多个进程或线程并发访问某一资源的机制&#xff0c;为了解决数据访问的一致性和有效性问题。在数据库中&#xff0c;除传统的计算资源(CPU、RAN、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、…

windows无法访问github

##一、如果发现windows无法访问github时 一般就是我们的dns出现了问题&#xff0c;此时我们需要更换一个dns访问 ##二、解决方法 首先我们访问ip查询地址&#xff0c; https://ipchaxun.com/github.com/ 可更换下面历史ip进行测试&#xff0c;在windows的cmd里面输入ping git…

【C++深度探索】:继承(定义赋值兼容转换作用域派生类的默认成员函数)

✨ 愿随夫子天坛上&#xff0c;闲与仙人扫落花 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞…

pin是什么?管脚

1.平面分割 1)启动Allegro PCB design &#xff0c;打开.brd。深色部分属于一个net&#xff0c;要做一下修改&#xff0c;将上面的pin包含进shape中&#xff0c;i进行a&#xff0c;b两步操作&#xff0c;删除以前存在的Anti Etch下的line&#xff0c;再将其进行补齐 使它保住上…

MSPM0G3507——OPENMV给M0传数据(用数据包)互相通信(以循迹为例)

OPENMV端代码 # main.py -- put your code here! import pyb, sensor, image, math, time from pyb import UART import ustruct from image import SEARCH_DS, SEARCH_EX import time import sensor, displayuart UART(3, 115200, bits8, parityNone, stop1, timeout_char10…

Pogo-DroneCANPWM模块:可实现DroneCAN转PWM,DroneCAN转dshot,DroneCAN转bdshot

关键词&#xff1a;Ardupilot&#xff0c;Pixhawk&#xff0c;PWM&#xff0c;dshot&#xff0c;bdshot&#xff0c;DroneCANPWM&#xff0c;电调ESC&#xff0c;DroneCAN&#xff0c;UAVCAN&#xff0c;飞控&#xff0c;无人机&#xff0c;UAV Keywords&#xff1a;Ardupilot…

Xilinx FPGA:vivado串口输入输出控制fifo中的数据

一、实验要求 实现同步FIFO回环测试&#xff0c;通过串口产生数据&#xff0c;写入到FIFO内部&#xff0c;当检测到按键信号到来&#xff0c;将FIFO里面的数据依次读出。 二、信号流向图 三、状态转换图 四、程序设计 &#xff08;1&#xff09;按键消抖模块 timescale 1ns…

Python编程学习笔记(1)--- 变量和简单数据类型

1、变量 在学习编程语言之前&#xff0c;所接触的第一个程序&#xff0c;绝大多数都是&#xff1a; print("Hello world!") 接下来尝试使用一个变量。在代码中的开头添加一行代码&#xff0c;并对第二行代码进行修改&#xff0c;如下&#xff1a; message "…

Github 2024-07-07php开源项目日报 Top9

根据Github Trendings的统计,今日(2024-07-07统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目9Blade项目2JavaScript项目1Laravel:表达力和优雅的 Web 应用程序框架 创建周期:4631 天开发语言:PHP, BladeStar数量:75969 个Fork数…

什么时候考虑将mysql数据迁移到ES?

文章目录 对ES的一些疑问问题1:ES相比mysql本身有哪些优势&#xff1f;问题2:哪些场景适合用ES而不是mysql&#xff1f;问题3:mysql逐行扫描&#xff0c;根据过滤条件检查记录中对应字段是否满足要求属于正排索引&#xff0c;根据二叉树索引检索记录的方式属于正排索引还是倒排…

LeetCode 189.轮转数组 三段逆置 C写法

LeetCode 189.轮转数组 C写法 三段逆置 思路: 三段逆置方法:先逆置前n-k个 再逆置后k个 最后整体逆置 由示例1得&#xff0c;需要先逆置1,2,3,4 再逆置5,6,7&#xff0c;最后前n-k个与后k个逆置 代码 void reverse(int*num, int left, int right) //逆置函数 { while(left …