粉丝3369获赞2.9万

什么是 makel 呢? makel 是我们 linux 中一个非常重要的一个东西,你看这是现在这个桌面上看到的,这就是我的一个呃, linux 的一个工程啊,这个很多很多个点 c、 点 h, 然后他们共同组成了一个工程,去完成了一个特定的一个功能,他的 makel 在这里,这个就是他的 makel, 然后现在我先点开单线机,单线机的 q, 我们看我们的程序是怎么生成的, 当我们写好代码之后,我们直接点点击这先预编译,然后再编译。啊,现在我这个是有个错误啊,如果我们没有错误的情况下,就是我们的下载器连好我们的板子,我们直接点击这个肉的啊,程序就烧到我们百字格去了。在单信息里面我们是这这么个操作方法,但是在 linux 里边我们应该怎么去操作呢? 我们就是通过这个 maxfill 来啊,生成呢就这么一个可执行文件,这一个 maxfill 就把所有的文件然后给他串联起来,最后就生成了这么一个可执行文件,我们只需要把这个可执行文件考到我们对应的板子里边去,然后运行他,这时候 他就可以像我们单线机里边,这这个就相当于是我们单线机里边的一个点 c 和一个点 h, 然后这个就是最终生成的文件,我们把它放到我们的板子上,把那些入口参数什么给他加好,然后我们直接运行,他就能按照我们这个程序代码里边所写的这个逻辑功能,他就一步一步的去执行和实践了。 makesale 说白了就是把这个一堆啊点 c 和点 h 给它串联起来,生成一个可执行文件,这个就是 makesale, 你理解了吗? 这个呢是我的微信,有什么问题呢?可以直接加我的微信,私聊我,点赞加关注,持续为你分享更多的嵌入式开发开发干货知识点。

好,欢迎大家回来,我们进入第五小节的学习,就是 macfer, 我们上一节的话是,呃,讲了一个最简单的一个,呃,内核模块啊,他比较简单啊,只是有一个,我们来回忆一下啊。呃,他只有一个 hello init 和 hello exit, 那么我们去 install 的时候,它其实是会去执行这个 hello init 这个函数,当我们去执行那个 imot 冒的 imot 那个命令的时候,它会执行这个 hello exit 这个函数。 好,现在我们就来看一下这个,我们上节课呃,遗留的这一点就是 mac far, 这个 mac far 到底干了什么事啊?这个其实很重要,尤其是在我们这个,嗯,咱们后面随着这个做的这个项目越来越深啊,越来越复杂啊。嗯,尤其些这个内核里面 这些工程化管理,这个都是依赖于这个麦克范,我们有的时候去添加一个模块啊,或者说有的时候去移植一个别人的这个,一个,呃,一个驱动,那么我们首先要改的这个可能就是麦克范,然后呢还有什么设备术啊,啊,还有些这个交叉边工具店啊等等。 呃,那交叉编辑工具呢,也是在 microfar 里面改的,所以这个 microfar 这个都知识点很重要。呃,我们来看一下这个,呃,这个 microfar 的,我把它截了个图啊,那么这个地方一那个可能不太好看啊,这样我们用这个, 用这个 m p p 来看来看一下,给它放大一点啊,这样大家看的更真切一点。那么这个 mirafar 的话,它,呃会执行 三遍啊,就是说这个 microphone 其实它会进来三遍,为什么会直营三遍呢?呃,首先第一个来看一下这个虚拟技能,我们敲一下啊, 啊,当我敲一个 mag 的时候,那么首先他肯定会进来,对不对啊?他首先会进来,那么第一次进来的时候啊,他这地方有一第一行就是 ef note 一块,然后一块里面的第一个 变量就是这个科努尔利斯,这个呢?这个玩意是什么东西呢?这个其实是在内核,是内核元马术下面的一个。呃,环境变量,我们那个时候呢,当我们第一次敲麦的时候,其实他这个什么呢?是没有,这个变量是没有的,是空。 然后呢?右边逗号,右边是第二参数,第二参数没有填不就是空吗?对不对?也说他们如果不相同的时候就怎么样就到这,但是我们他也是空,所以空对空是相同的 啊,不相同进他,所以应该走到二次面啊,走到二次面之后,然后呢这边我们会有一两个环境变态,一个叫凯迪亚,这是内核的一个路径, 这个是什么东西呢?我们看这路径啊,他这个这个冒号等于啊,就是一个负值变量啊,你看他这个啊,这是一个环境变量啊,这是基本的一个事啊,如果这个大家不太清楚的话,你们可以去把这个事相关的知识点去复习一下啊。 右边叫 library modules, 这是一个路径,绝对路径,看到没有?这是一个绝对路径,然后这地方有一个取自付串,哎,这个一个刀了刀了,其实就把后面这个这个命令的内容,然后呢取出来,然后呢把它的结果,然后作为一个自付串填充在这个位置, 这里面呢是一个 share, share 也说执行是用利用 share 执行什么 um 杠而这个命令啊,那这样的话,我们 来看一下 um 杠二应该执行命令执行是什么结果, 我们看是不是这个是这样一个结果。好,然后现在我们就来看一下, 然后右边还有个 bear, 对不对?我们就来看这个路径到底有什么东西啊?好,进入它 cd 点 library module modules, 然后呢?哎,四点,那我们先进到这个模组下来看一下啊,好,这个下面呢,然后会有两个 文件夹,我们应该是哪一个啊?刚刚我们说的是幺三六的这个是不是?好,那就进入 c d 四点幺三六 啊,这个目录是什么呢?其实跟大家讲一下,就是什么,就是我们这个安装这个鱼帮兔的时候,他其实会把这个他当前这内核啊,就是编好的这些这个目标文件 啊,他不,他没把原文件给我们,他是把这个目标文件啊什么的,就是编好的什么开文件啊等等啊,包括这个整个这个内核的一些,这个很多,呃,编译需要依赖的这些目标文件,他全部都放在这个目录下面了 啊。有的时候我们可能升级啊,比如说你安装的时候,你,你去升级他,然后这地方可能会多个,比如你原来是三年级的版本,然后你升你,你这局升级了,比如说你从尤邦兔十六升级到二十,那他可能这地方内壳就变了,他这地方可能就会有多个啊, 但是不管是哪一个,你只要敲着 um 杠 r, 你就可以知道我们当天使用的是哪一个内核。所以我们到这里面看这里面的话,然后就会有一个叫 bird 的一个动作,这里面 放什么呢啊?这个目录的话,呃,之前咱们是剪过,对不对?就是你看他是不是非常像我们一个内核的一个那个文件夹目录啊?一个一个树状结构,对不对啊?这就是这个啊,这里面就放什么呢?就放了咱们这个,呃,编译,呃, 生成一个内核目标文件所依赖的什么呀?这个内核就在这这里边啊,我们知道就可以了,好吧?好,在这里边呢?然后呢? build 进来之后, 呃,没有进来,这是一个内核路径啊,下面就是这个 p w p w d 什么?就是 shell, p w 就是我刚刚在执行什么呀?红鹏 driver modules, 就是我。我刚刚不是在这地方敲了一个 mac 吗?对不对?然后呢?这个时候呢?他会干什么?他会把这个 p w d 就是这个命令的结果。当前的路径干什么呀?存储在这个大写的 pw 这个环境变量里面,也就是他会记录这个路径,然后紧跟着他去执行麦克杠 c 啊,直接。然后呢?他紧跟着到这个凹第一个目,这是第一个目标,对不对?第一个目标到他这是一个默认的目标,因为我们我敲的是麦克,而不是麦克,不是麦克 clean, 对不对?所以呢?他会走到第一个默认的目标啊,这是麦克范,他的一个特点。就说这个,嗷 clean, 对不对?如果我敲的是麦克 clean, 那么他就会去执行 clean 下面的这个命令,如果我敲的是麦克二, 那么他就会执行 all 下面这条命令执行完之后,注意这向下命令,他就不再执行了,他就跳出去了 啊,他就只执行这个东西啊,这是 macfer 他的一个,这个叫 target 啊,这是。后面呢,本来也可以有一点关系没有,没有就不管,然后呢下面是要值得命令,注意这地方一定要,要是个 table, 一定要是个 table, 他的约束规定啊,就是必须是个 table, 就命令这前面一定是个 table, 不是按空格的,一定按 table 啊 啊, tb 键啊,一个缩进啊,好,然后他就会执行 mac 杠 c, mac 杠 c, 然后还有一个 m 等于什么东西?还有一个 models, 这是什么东西啊这是? 呃,这个就是 mac, 然后呢?呃,进入这个内核目录,也就是说进入到这个 build 的目录下面啊,就是我们这个 build 的目录下面,就是我们刚刚这个 build 那个 build 目录下面啊,然后呢?呃,进入目录下面,然后呢他的命令叫 modules mac modules。 mac modules 什么意思呢?就是我们编音内核啊,有两种方式, 一种呢就是把一个驱动文件或者一个模内盒,可以在内盒里面加载的一个模块文件,可以独立于内盒之外进行编译啊,这就是叫麦克 modus。 然后呢我们也可以把这个内核模块文件编一到内核内个整个镜像里面。也可以啊,一共两种方式啊,那么 第二种方式就是编辑到内核里面这种方式呢?呃,后面咱们有时间啊,我们去再来看他,现在我们先不管他,我们只管就是把一个内核模块给他独立于内核,然后在外面编译,然后给他动态加载进去,我们只讲这种方式啊, 好,这是 mic modules, 那么这个 mic modules 的话,呃,我们来找一下我这个已经解压好的一个啊,这个内盒啊,它这个原码啊,这边有个 mic far, 比如说假设这,这就是我假设这个是我的一个,呃,一个内核啊,那么注意,你看这顶层麦克范,我们打开看一下,其实跟内跟内里面差不多啊,我们在这里面看啊,然后呢,这地方麦克 modules 来搜一下啊,我们来看看人, so fine, 快到了啊, 我觉得这才一千多行, 因为这个还不等于什么东西啊。哦,在这啊, 我们看啊,他这个是一个内核里面的最顶层的 mac far, 其实我们在执行这个刚刚这个命令的时候,他是怎么样?他其实就会去呃,进入到这个一个内核的一个顶度,然后去执行对应的命令,然后呢我们看一下,如果我们敲的是 mac m 等于 d r 啊, modules, mac all modules in specified the di 啊,就是在指定的一个目录下面去编译模块文件,我们是不是应该是这个命令啊?你看我刚刚这个 对不对?杠 c 是进入它对不对?然后呢? m 等于,然后 modules, 是不是啊?也就是说这地方我们就会执行它啊,就这意思,然后呢?至于说这个卖法里面是怎么去执行的,那么这个呢?呃,你们有兴趣自己去分析,咱们就不分析它了,好吧,你就知道,呃,我们刚刚 这个麦范,然后现在就已经进入了那个原码数,然后就去买个范了,那么当他在执行这个 mac models 的时候,注意,因为我们不是带了个 m 进来吗?他就会去 到 m 这个目下面去找我们的目标文件,找我们这个点 c 文件,那对不对?就像我们来到这,他就来找这个 hello 点 c 这个文件, hello 点 c 这个文件,然后呢?他, 他,他过来找的时候,然后呢?他又于是呢就第二次进来,再次进来的时候,然后呢他就去进来之后呢?然后他又去执行这个麦范,但是第二次进来的时候这个 ctrl 的意思呢?他这时候怎么样?他就已经有什么呀? 他就已经有这个呃内容了啊?就在刚刚那顶层 mac far 里面他会去负个值,所以这时候呢他又走到 第二行,第二行呢是叫 ob 界杠 m, 这是什么意思啊?这个是生成一个模块化的一个目标文件,然后呢模块化目标文件呢?它需要依赖于什么呀?哈喽点 o, 所以这个时候他就知道他的第一步要干什么呀?他要去把那个我们当天这个哈喽点 c 文件给他编辑成一个目标文件, 好,编好,我们不要文件,对不对?编好我们不要文件之后,然后他就从这个麦发里面就出来了。出来之后,然后我们刚刚这个内核的这个顶层文件他又会去干什么?执行一个链接操作,这个链接操作呢就会怎么样?又会再次进入到我们这个木头下面,然后呢他就会怎么样? 他就会去把我们刚刚生成那个 hello 点 o 这个文件,以及在内核里面他所依赖于,因为这个文件有可能依赖于内核的一些其他的目标文件,他就把这些 文件怎么样给他从那个呃内核路径就是我们刚刚哪个就是这个下面啊?然后呢去把这个呃他的这个目标文件和我当前这个 hello 点 o 文件,然后呢链接生成一个 hello 点 k o 这个文件啊,他会生成这个 k o 文件 啊,也就说他一定会进来三次啊。那么第一次是因为我们敲麦克,他去执行的,后面两次呢,是因为内盒里面的麦克范,他会啊,再次进来 他会再次进来,连他他会进来两次。第一次是生成 hello 点 o, 第二次呢是生成 hello 点 k o, 那么这个怎么来验证呢?比如说我们想知道这个你怎么能证明他是确实进来两次呢?当然我们刚刚其实 log 也能看出来,但是呢,我们还可以 在这地方,我们知道最简单就是什么加一个,呃,加一个什么?加一个打印信息,对不对啊?加一个打印信息啊?那么 microphone 里面加打印机不是 pro 啊,比如说这个 first, 他用 v 那个 inform 的命令啊, y y, 这应该是第二次,这是第二次进来 second y p 啊,这地方是注意它可以执行多个命令,就是比如说我 micro 对不对?它可以执行两个命令,也可以执行三命令,下面如果有继续往下加就可以了。但是他看到这个 clean 呢,这是一个顶头的,他就知道这个 已经结束了,他就下面都不会执行。这就是人家为什么告诉你这地方一定要 tiger 啊,就这个意思啊,他要求比较严格,必须是这样啊,这样的话我们是不是写了两个第三次?注意后面两次是一样的,对不对?我们就来看一下他到底这个会怎么打印。好吧, 我们先麦克令一下啊,你看麦克克令之后是不是就是删干净了,对不对啊?全部删掉了啊?麦克克令话,其实刚刚这个麦克可能比较简单,对不对?就是 执行我们这个 r m r m 杠 f 就是星点 ko, 星点 o 等等,就是把这些编译所生成的这些临时文件全部给他删掉了啊,全部删掉了,好,我们再来 mac 一下,诶,我们来看一下啊, 第一次你看是不是 first, 对不对?呃, first 我们刚刚是怎么加的 这个位置,对不对? copy 啊,对不对?第二次,然后这个是在这个地方加的,我们在这两个地方加的啊, 好,来看一下啊,你看到我们这 mac 的时候,第一个先打印的 first first 在哪?是不是在这?第八行,对不对?所以他是不是先打印的这个 first 对不对?说明他是第一次是走到这里面,他没有走到上面吧?然后呢?紧跟着 mac 杠 c, 我们看一下 他是不是就进入到这个内核路径下面,走到这个 builder 下面的, 对不对?然后呢? m 这个值是被带过来的,对不对啊? m 等于啊 p w d 这个也带过来了,然后执行这条命令,执行第一个命令之后,然后呢?我们知道卖杠 c 会怎么样?会进入到这个路径,所以他看到没有 entering directory directory, 然后是不是进入到这个,进入到这个东西下面,注意他把这个替换掉,对不对?给他进入到这个东西下面啊?进入到这个东西下面,然后呢? 进入之后我们说了第一次是不是就就就出来了?然后紧跟着那个内盒元宝说的 manufa 怎么样?他会再次进来 second, 第二次进来的时候他走到哪?走到这个 second 的这地方 对不对?你是不是打印的第二行了?然后呢? c c c c 是干什么呀?边翼生成 hello 点 o 对不对?我刚刚讲的吧,第二步是什么呀?就是把它生成一个目标文件,然后呢?紧跟着内核,内核元宝 又怎么样?又回去?第三次进来又打印了一次 second, 又走到第二行里面,这次来是干什么的?你看他。然而什么呀?把这个 hello 点 o 文件变成了一个 hello mod 点哦,看到没有 mod 点哦。是什么?是模块化的一个目标文件?因为,呃, 第一次 ccgcc 编译的时候哈德典,哇,他是什么呀?他是一个呃,他的目标组织形式啊,跟这个木内核的是不太一样的,就两个目标文件格式是不一样的,所以第二次进来时候他要把它变成什么样?模块能够那个一个格式。然后呢? ldld 这名单应该比较熟了,链接 对不对?链接文件的话他是什么啊?就将这个 hello 点 o 以及他所要依赖的内盒的一些其他的文件怎么样?链接是那个 hello 点开文件完成之后, leaving directory 离开这个路径,于是又回到当前路径下面,于是一个完整的变异过程就结束了啊, 所以这就是很多的同学啊,不太理解啊。这个以前我也遇到过,就是以前上课的时候有个学生说,哎,这个我在网上看,人家说这个麦克范是直营两次啊,我说你,你有没有听我的课啊,对不对?我说我这已经论证过了,这已经三次啊,对不对啊?所以说遇到一些这个呃 别人写的东西跟你的这个呃之前整理东西有所不一样的时候,你就要怎么样呢?你自己要去分析对不对啊?你比如说像我,我看了之后 我就想把它论证一下,到底是两次还是三次,所以我就打印一下嘛,对不对就只有论证了啊,我的猜测,好,这个就是这个 mifer 啊,然后呢这地方呢, 也画了一个图,可能会相对清晰一点,我们来看一下啊啊,第一次执行 mac 执行的是模块的 macfer, 然后呢这个 mac 怎么样?会去调用内核 linux 内核原码数的 macfer, 这个 mfi 怎么怎么样呢?他会去啊,编译模块需要的信息收集,于是编译了我们的哈喽点 o, 对不对?编译完之后怎么样?编完之后,然后他要 回来,他再次调用调用模块的 macfer, 然后呢生成 hello 点和文件,对不对?然后呢 同时他还要什么再调一次这个麦克范,然后呢去收集一些这个信息,然后链接上面开文件,就这么一个过程啊, 呃,第一次是 hello 点哦,第二次是生成 hello 点开网,好,这就是我们这个 microfire 这个知识点,那么我们在内核的目录下面啊,我们就在看我这个解压过的吧, 其实这个 maffar 它呃非常的庞大,很难理解啊,但是呢,呃内核人家已经把它写好了,我们只需要知道就可以了。然后你像我们如果后期,比如想自己去呃在内核里面添加一些内核模块文件,比如我们到 grver 里面来找一下啊,比如说这个 随便找一个啊啊,比如说你在某个目录下面你想去添加一个文件怎么样?它这边就有 microfire 和 cut configure 啊, microfire 和 cuccomfigure 两个配合起来,然后呢?呃,就会去, 呃,可以添加一个呃模块文件啊,这个我们留放到以后再讲吧,这个可能是就有点长了啊。好,今天我们内容就暂时讲的多,下一节我们讲这个符号表的一个导出问题,就是 export symbol。 啊,这个知识点好,感谢大家。


viscode 文件兵役打开上一期教程安装好的 viscode, 打开扩展搜索 make l 点击安装,打开文件夹,选择一个空的文件夹,创建 main, 点 c, 然后输入简洁中提供的代码, 创建 printenc, 然后输入简洁中提供的代码 contour o 加 s 保存,然后 contour old shift p 打开命令窗口,搜索麦克回车, 选择 only c mac five 快捷键, ctrl o 加波浪号,打开终端,输入 man 三十二段横杆 mac 回车, 可以看到生成了一个 my app e x c 输入 my app, 点 e x e 运行,可以看到输出了 hello 么了。到此你已经学会了简单的多文件编译下一期教程,让 c 程序在网页上运行。




比特就业课编程环境问题大全共计一百家视频主讲人比特答疑团队现在开始上课,今天本期视频给大家去讲在 vs code 下写 make fail 时,我们的 tab 键被自动转化为空格,导致出错的一个问题。 很多同学看到这块的一个报错信息可能会比较熟悉一些,就知道说是我们的 tab 键,呃,我们写成了空格,但是呢,在 vs code 下,我明明按的是 tab 键,但是为什么还会出现这样的一个错误?它是因为我们的 tab 键被自动转化为了空格。那这个问题怎么去解决呢?我们可以按一下 ctrl shift 加 p, 然后回车,我们输入 insert space, 然后我们将这块的一个选项给它勾选掉,我们可以看到它写的是按 table 式插入空格,就是我们 vs code 默认这些选项是被勾选上的,我们的 tab 键有可能会被转化成空格,所以说才会导致我们这块的一个出错。我们在那边给它勾选掉之后,我们把这块一个删掉,我们重新按一下 tab 键, ctrl s 保存一下,我们重新 make 编辑, 我们会发现这个问题它就解决了。问题的原理就是我们的一个依赖关系和依赖方法的,而依赖方法其实就是我们的一个命令, 它最终会被转化成设命令去执行。而我们的 make fail 它的一个规则就是在每一个命令,也就是每一个依赖方法之前,我们是要通过 table 键进行标注的,所以说你使用空格给它进行补齐,或者说是在 vs code 下,它自动被转化成了空格,它都会导致这块的一个出错。所以说如果我们大家遇到这块的问题, 我们可以在这块进行一个设置就可以解决,然后希望这个视频可以给大家带来帮助,谢谢大家。全民制作人们,大家好,我是练习时长两年半的个人练习生蔡徐坤,喜欢唱跳 rap、 篮球 music。