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

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

前言

(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这样写即可。


相关实践学习
CentOS 8迁移Anolis OS 8
Anolis OS 8在做出差异性开发同时,在生态上和依赖管理上保持跟CentOS 8.x兼容,本文为您介绍如何通过AOMS迁移工具实现CentOS 8.x到Anolis OS 8的迁移。
目录
相关文章
|
1天前
|
存储 Linux Shell
Linux|Transfer.sh 轻松实现文件共享
Linux|Transfer.sh 轻松实现文件共享
14 2
Linux|Transfer.sh 轻松实现文件共享
|
16天前
|
存储 网络协议 Linux
【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件
本文详细介绍了Linux中的进程IO与系统调用,包括 `open`、`write`、`read`和 `close`函数及其用法,解释了文件描述符(fd)的概念,并深入探讨了Linux中的“一切皆文件”思想。这种设计极大地简化了系统编程,使得处理不同类型的IO设备变得更加一致和简单。通过本文的学习,您应该能够更好地理解和应用Linux中的进程IO操作,提高系统编程的效率和能力。
66 34
|
10天前
|
Linux
Linux文件与目录的日常
目录的切换 一般使用(”pwd“)显示当前所在的目录 比如:当前目录是在home下面的,与用户名相同的文件夹,可以使用(”cd“)命令来切换目录; 进入下载目录(”cd home/a/下载“)这种从给目录开头的一长串路经”叫做绝对路径“; 进入图片目录(”cd .. /图片/“)".."代表当前路径的上级路径,相对于当前的目录而言的”叫做相对路径“,(”.“)代表当前路径; 如果,想快速切换,上一个所在目录可以(”cd - / cd..“); 如果,想快速切换,追原始的目录可以(”cd --“); 查看目录及文件
35 14
|
2月前
|
Rust Ubuntu Java
[Linux工具] Makefile
Makefile是Linux环境下用于自动化编译和链接程序的配置文件,常用于简化大型项目的编译流程。通过定义目标文件、依赖文件及生成命令,Makefile能高效管理编译任务。它不仅适用于C语言项目,还可扩展到其他编程语言和非编程任务中。
59 20
[Linux工具] Makefile
|
6天前
|
Linux Shell
Linux 将所有文件和目录名重命名为小写
Linux 将所有文件和目录名重命名为小写
20 3
|
20天前
|
Unix Linux C语言
【Linux】 Linux makefile 教程
本文详细介绍了 Linux 环境下 Makefile 的基本结构、语法和使用方法,并通过一个简单的 C++ 项目示例演示了 Makefile 的实际应用。Makefile 是一个强大而灵活的工具,通过合理配置,可以极大地简化项目的编译和管理过程,提高开发效率。希望本文能帮助您更好地理解和应用 Makefile,在实际项目中高效管理代码的编译和构建。
50 20
|
19天前
|
Unix Linux C语言
【Linux】 Linux makefile 教程
本文详细介绍了 Linux 环境下 Makefile 的基本结构、语法和使用方法,并通过一个简单的 C++ 项目示例演示了 Makefile 的实际应用。Makefile 是一个强大而灵活的工具,通过合理配置,可以极大地简化项目的编译和管理过程,提高开发效率。希望本文能帮助您更好地理解和应用 Makefile,在实际项目中高效管理代码的编译和构建。
55 16
|
3月前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
98 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
3月前
|
Ubuntu Linux Go
golang编译成Linux可运行文件
本文介绍了如何在 Linux 上编译和运行 Golang 程序,涵盖了本地编译和交叉编译的步骤。通过这些步骤,您可以轻松地将 Golang 程序编译成适合 Linux 平台的可执行文件,并在目标服务器上运行。掌握这些技巧,可以提高开发和部署 Golang 应用的效率。
324 14
|
3月前
|
存储 NoSQL Linux
linux积累-core文件是干啥的
核心文件是Linux系统在程序崩溃时生成的重要调试文件,通过分析核心文件,开发者可以找到程序崩溃的原因并进行调试和修复。本文详细介绍了核心文件的生成、配置、查看和分析方法
183 6