韦东山Linux教学视频中的makefile文件详细介绍

news2024/11/19 9:38:20

前言

(1)在学习韦东山Linux教学视频的时候,他的makefile并没有做详细的介绍。以至于我学了很长时间对他的makefile文件不理解。所以本文将会详细介绍韦东山Linux教学视频中的makefile文件含义。
(2)注意:我使用的是韦东山的配套i.max6ull pro开发板。如果是其他系列开发板,makefile文件的KERN_DIR = 需要改成你的Linux内核路径。
(3)阅读本文之前,需要具备一定的makefile语法基础,如果没有,请先学习Linux-GCC介绍+入门级Makefile使用的Makefile介绍部分。
(4)强调:我这里只是帮助各位理解韦东山老师的makefile文件是什么意思,保证你看完之后能够对这个文件进行更改,但是不保证你能够自己从0写一个makefile。

韦东山makefile文件源代码

以下是韦东山老师的makefile文件,我加了一些注释。


# 1. 使用不同的开发板内核时, 一定要修改KERN_DIR
# 2. KERN_DIR中的内核要事先配置、编译, 为了能编译内核, 要先设置下列环境变量:
# 2.1 ARCH,          比如: export ARCH=arm64
# 2.2 CROSS_COMPILE, 比如: export CROSS_COMPILE=aarch64-linux-gnu-
# 2.3 PATH,          比如: export PATH=$PATH:/home/book/100ask_roc-rk3399-pc/ToolChain-6.3.1/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin 
# 注意: 不同的开发板不同的编译器上述3个环境变量不一定相同,
#       请参考各开发板的高级用户使用手册

# 内核源码路径
KERN_DIR = /home/book/100ask_imx6ull-sdk/Linux-4.9.88

all:
	# -C表示将当前的工作目录切换到指定目录中,也就是Linux内核源码路径
	# M=表示模块源码目录
	# pwd表示获取当前文件路径,因为makefile一般和模块源码在同一个路径,所以这里可以直接使用pwd指令
	# modules表示编译模块
	make -C $(KERN_DIR) M=`pwd` modules 
	# 将ledtest.c 编译成开发板能够执行的可执行文件ledtest
	$(CROSS_COMPILE)gcc -o ledtest ledtest.c 

clean:
	# 将模块清空	
	make -C $(KERN_DIR) M=`pwd` modules clean
	# 清除过度文件modules.order,这句话没有用处,上一句也会清除modules.order文件
	rm -rf modules.order
	# 删除可执行文件ledtest
	rm -f ledtest

# 参考内核源码drivers/char/ipmi/Makefile
# 要想把a.c, b.c编译成ab.ko, 可以这样指定:
# ab-y := a.o b.o
# obj-m += ab.o

# make工具根据名字将.c编译成.ko模块
obj-m += leddrv.o chip_demo_gpio.o


前期准备工作—设置交叉编译工具链

(1)因为开发板和电脑端的架构是不一样的。所以他们的可执行文件是不同的,在电脑端能够运行的可执行文件,开发板是跑不了的,反之同理。
(2)为了能够让我们编译出开发板能够执行的可执行文件,就需要先设置交叉编译工具链。
(3)如果是跟着韦东山老师的视频课程的来的,教程编译工具链应该是永久配置好的。(详情可看嵌入式Linux应用开发完全手册V5_IMX6ULL_Pro开发板,第三篇环境搭建与开发板操作,2.6.3节配置交叉工具链)
(4)因为韦东山老师的文档对交叉工具链配置已经很详细了,所以我不再赘述。这里只是会讲解如何查看自己是否永久配置好交叉工具链。
(5)打开终端,输入指令: vim ~/.bashrc

在这里插入图片描述

(6)
<1>进入VIM编辑器之后,输入: /PATH
<2>如果能够跳转,并且找到如下图的三行文字,就表示交叉工具链已经被配置好了。如果没有进行跳转,说明没有被配置好。

在这里插入图片描述

(7)如果没有配置好交叉编译工具链,就在命令行输入如下三行指令。(注意,如果是韦东山配套的i.max6ull就是执行这个。其他的板子请自行寻找你的交叉工具链配置方法)

export ARCH=arm
export CROSS_COMPILE=arm-buildroot-linux-gnueabihfexport- 
PATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin

代码详细介绍

KERN_DIR = …介绍

(1)这一句是进行赋值操作,我们会发现,这个makefile中还有其他的KERN_DIR 。
(2)这个就相当于C语言的赋值,a = 3。那么此时变量a就是3了,后面只要出现字符a,并且字符a没有再次赋值,那么a就是代表数字3。
(3)这个是用来指定Linux的内核路径的。因为我们编译文件,需要使用到Linux库函数,所以需要指定Linux路径。

KERN_DIR = /home/book/100ask_imx6ull-sdk/Linux-4.9.88

all:介绍

(1)如果有makefile 的基础概念知识,就知道这是一个判断语句。
(2)因为all:是第一个判断语句,而且all永远不存在,所以只要在终端执行make指令,就会执行all:下面的指令。

all:
[TAB]命令

make -C $…介绍

(1)-C表示将当前的工作目录切换到指定目录中,也就是Linux内核源码路径。因为我们需要调用Linux内核库函数。
(2)M=表示模块源码目录,也就是我们写的驱动.c文件。
(3)这里的’pwd’效果和在终端执行pwd指令效果是一样的,都是获得当前文件路径。为makefile一般和模块源码在同一个路径,所以这里可以直接使用pwd指令。
(4)最后面的modules表示编译模块

make -C $(KERN_DIR) M=`pwd` modules 

在这里插入图片描述

$(CROSS_COMPILE)gcc … 介绍

(1)看到这一段代码,可能有些人会有疑惑,CROSS_COMPILE是什么东西?代码里面没有出现过这个玩意啊。
(2)CROSS_COMPILE就是我们在配置交叉编译工具链的时候设置的玩意。 export CROSS_COMPILE = arm-buildroot-linux-gnueabihf- ,所以说,CROSS_COMPILE就是arm-buildroot-linux-gnueabihf- 。那么$(CROSS_COMPILE)gcc就是arm-buildroot-linux-gnueabihf-gcc,看到这,大家是不是熟悉起来了。没错,就是编译开发板能够执行的可执行文件。
(3)所以这句话就是让应用层的.c文件编译成开发板能够执行的可执行文件。

$(CROSS_COMPILE)gcc -o ledtest ledtest.c 

clean: 介绍

这个其实是makefile基础知识,如果我们在命令行输入make clean。就会执行clean:下面的命令。

make -C $(KERN_DIR)…介绍

这个指令就是删除产生的.ko文件,.o文件,过渡文件modules.order等东西。

make -C $(KERN_DIR) M=`pwd` modules clean

rm -rf modules.order介绍

清除过渡文件modules.order,这句话没有用处,make -C $(KERN_DIR) M=pwd modules clean也会清除modules.order文件

rm -rf modules.order

rm -f ledtest介绍

这个就是删除开发板的可执行文件ledtest

rm -f ledtest

obj-m += …介绍(重点!!!)

(1)make工具根据名字将.c编译成.ko模块。例如,leddrv.c就会被识别到,编译成leddrv.ko。chip_demo_gpio.c就会被识别到,编译成chip_demo_gpio.ko。

obj-m += leddrv.o chip_demo_gpio.o

(2)为了加深理解,如果我们讲chip_demo_gpio.o稍微改一下。假如我们不小心少些了一个o,把chip_demo_gpio.o写成了chip_demo_gpi.o会发送什么呢?

在这里插入图片描述

如何根据自身需求更改这个makefile

(1)首先,我们需要知道自己的内核源码路径。然后将自己的内核源码路径更改一下。
(2)根据自己要编译成模块的.c文件名字来在obj-m +=写数据。比如我们想让SR04.c文件编译成SR04.ko模块。obj-m += SR04.o这样写即可。

在这里插入图片描述

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

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

相关文章

使用 docker-compose 部署 Jenkins

注&#xff1a;我是在虚拟机&#xff08;Ubuntu&#xff09;上部署了 docker-compose&#xff0c;然后才使用 docker-compose 部署 Jenkins&#xff01; 关于如何在 Ubuntu 部署 docker-compose&#xff0c;可以看我其它的文章。 本文目录 1. 创建 docker_jenkins_compose 目录…

【NI USRP】每一个USRP是如何命名的呢,和原厂Ettus型号有什么关联呢?

详细的硬件配置&#xff0c;非常有助于设备的选型。 如果您采购了X310子板&#xff0c;是可以将其转化为对应的USRP型号的设备。 B系列 EttusNI-USRP频段最大带宽通道B200mini无70 MHZ - 6 GHZ56 MHz1X1B200mini-i无70 MHZ - 6 GHZ56 MHz1X1B205mini-i无70 MHZ - 6 GHZ56 MHz…

三菱以太网通讯模块在哪

捷米特JM-ETH-FX采用工业级设计&#xff0c;导轨安装&#xff0c;带通讯线。不占用PLC编程口&#xff0c;上位机通过以太网对PLC数据监控的同时&#xff0c;触摸屏可以通过复用接口X2与PLC进行通讯。捷米特JM-ETH-FX支持工控领域内绝大多数SCADA软件&#xff0c;支持三菱MC以太…

C#开发的OpenRA游戏之维修按钮

C#开发的OpenRA游戏之维修按钮 前面分析物品的变卖按钮,如果理解这个流程,再看其它按钮的流程,其实是一样的,所以前面的文章是关键,只有理解通透的基础之上,才能继续往下。 维修按钮的存在价值,就是当建筑物受到敌方破坏,还没有完全倒掉之前,可以使用金币来进行修理。…

java项目之电子商城系统(ssm+mysql+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的电子商城系统。技术交流和部署相关看文章末尾&#xff01; 开发环境&#xff1a; 后端&#xff1a; 开发语言&#xff1a;Java 框架&…

对抗业务逻辑攻击:传统安全工具为何失效

随着数字环境的不断发展&#xff0c;不良行为者寻求利用应用程序漏洞的策略也在不断发展。最阴险的攻击类型之一是业务逻辑攻击 (BLA)。与可以通过签名或模式识别的已知攻击&#xff08;例如 SQL 注入攻击&#xff09;不同&#xff0c;BLA 针对应用程序内的核心功能和决策过程。…

python_股票增加控制人与流通股东等筛选条件

目录 写字前面&#xff1a; 结果展示 获取数据 行业数据 控制人数据 十大流通股东数据 开始合并 1 从行业数据中提取证券股的行业数据 2 合并控制人数据 3 合并十大流通股东 4 把三个结果按列合并 写字前面&#xff1a; 在分析数据的时候&#xff0c;常常需要的字段…

Hippo4j监控RabbitMQ框架的线程池

&#x1f680; 线程池管理工具-Hippo4j &#x1f680; &#x1f332; AI工具、AI绘图、AI专栏 &#x1f340; &#x1f332; 如果你想学到最前沿、最火爆的技术&#xff0c;赶快加入吧✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;CSDN-Java领域优质创作者&#…

【分布式系统管理框架】Zookeeper集群

分布式系统管理框架 1. Zookeeper1.1 Zookeeper概述1.2 Zookeeper工作机制1.3 Zookeeper特点1.4 Zookeeper数据结构1.5 Zookeeper应用场景1.6 Zookeeper选举机制 2.部署Zookeeper集群3. 知识点总结3.1 zookeeper3.2 zookeeper选举机制 1. Zookeeper 1.1 Zookeeper概述 Zookee…

什么是微服务架构

什么是微服务架构&#x1f349; 你考虑过吗&#xff1f;什么是微服务&#xff0c;为什么越来越多的企业&#xff0c;为了使自己构建的应用满足客户的期望&#xff0c;而和微服务架构进行整合呢&#xff1f; 微服务&#xff0c;又叫微服务架构&#xff0c;是一种软件架构方式。…

web-报错注入

必要的函数 rand select rand(0) from hackbiao; rand(0)&#xff1a;生成以0开头的随机数&#xff0c;生成的数量与字段下数据的条数相等。如果i没有这个地段的话&#xff0c;就会自己形成一个新的字段打印出来。 count和group by grouip by在进行排序的时候&#xff0c;会…

网络线程模型

堵塞IO模型&#xff1a;每个连接都由独立的线程进行处理。当并发度较高时系统资源占用较大&#xff0c;并且如果线程发生了IO堵塞还会浪费线程资源Reactor模型&#xff1a;reactor线程监听&#xff0c;并分发事件给相应的handlerProactor模型&#xff1a;交由系统进行异步处理&…

海岸带地物分类步骤

1.读取图像 使用 Envi 打开 imageKSC.tif 影像。在 Toolbox 工具栏中选择 Spectral->Build 3D Cube。在 3D Cube File 对话框中选择高光谱数据集&#xff0c;显示信息为 614*512*176 的高光谱影像&#xff0c;单击 OK 按钮。 图1 原始影像 2.选择波段 当打开 3D Cube RGB…

垃圾回收的核心知识点解析

目录 检测垃圾引用计数算法可达性分析算法 回收垃圾标记清除算法复制算法标记整理算法分代算法 Java运行时内存中的程序计数器、虚拟机栈、本地方法栈这三部分区域其生命周期与相关线程有关&#xff0c;随线程而生&#xff0c;随线程而灭。而程序计数器就是一个单纯存地址的整数…

Oracle Apex制作一个简单的交互式报表页面

简单查询一下&#xff1a; select ID,NAME,DESCRIPTION,PRICE from "FOOD_MENU" a 查询结果 创建交互式报表 工作报表展示 菜单报表展示 页设计器 改变布局样式 记得保存&#xff01;&#xff01;&#xff01; 修改标签内容 添加验证&#xff06;更改必填项 啥也…

BI-SQL丨XML

XML SQL Server中&#xff0c;存在一种特殊类型的数据&#xff0c;就是XML数据类型。 可能看到这里&#xff0c;小伙伴都会产生疑惑&#xff0c;XML不是Web语言么&#xff1f;为什么在SQL Server里面也会有XML数据类型&#xff1f; 这个就要从SQL Server的应用开始说起了&am…

自动驾驶MCU 软件架构说明

目录 1 文档... 2 1.1.1 变更历史... 2 1.1.2 Term.. 2 1.1.3 引用文档... 2 2 MCU软件框架图... 3 3 模块介绍... 3 文档 变更历史 版本Version 状态 Status 内容 Contents 日期 Date 撰写 Editor 批准 Approver V0.1 …

智慧工厂:如何打造工厂安全生产AI视频监管与风险预警系统?

一、背景需求 现代工厂多是机械操作&#xff0c;少量人员看守&#xff0c;甚至是无人化管理模式。企业都会在生产车间、仓库等重点区域安置摄像头留存画面用作回溯依据。但问题出现后再溯源&#xff0c;或许已经造成严重的生命安全事故和财产损失了。因此&#xff0c;对工厂各…

数据库技术与应用——目录篇

数据库技术与应用目录 文章目录 第1章 数据库基础知识数据库技术的概念数据管理的发展数据库的体系结构数据库管理系统常用的数据库管理系统介绍 第2章 信息得三种世界与数据模型信息的三种世界及其描述数据模型 第3章 关系模型关系模型的由来关系数据库的结构关系代数关系演算…