基础教程--环境搭建编译不求人--过程浅析

[复制链接]
查看816 | 回复8 | 2024-1-15 17:11:26 | 显示全部楼层 |阅读模式

知其然知其所以然,了解过程可以让你知道遇到问题该怎么做,所以这里从搭建环境到编译过程一步一步解释,
让新人在以后遇到类似问题可以尝试寻找原因或自己解决。

这是用到的仓库,以这个为例子,以及里面文档给的步骤。

搭建与编译步骤
  1. 一、克隆Ai-Thinker仓库
  2. 在linux的终端下输入
  3. git clone https://github.com/Ai-Thinker-Open/AiPi-Open-Kits.git
  4. 将整个开源硬件的DEMO仓库克隆下来
  5. 二、拉取子模块
  6. 首先进入AiPi-Open-Kits目录下
  7. cd AiPi-Open-Kits
  8. 在该目录下输入以下两条指令初始化及拉取子模块
  9. git submodule initgit submodule update
  10. 进入aithinker_Ai-M6X_SDK,拉取SDK子模块以及设置路径
  11. . install.sh. export.sh
  12. 三、编译和烧录
  13. 在AiPi-Open-Kits下可以看见各种小安派的Demo文件夹,使用cd命令进入到需要编译和烧录的Demo下
  14. cd 对应Demo目录文件夹make                          //编译命令make flash COMX=/dev/ttyUSB0  //烧录命令
复制代码

一、环境搭建过程:


是把源码从git克隆下来,相当于下载一份源码到自己电脑上。

常见的问题是github连不上,那么开魔法,或者从其它地方下载也一样,比如gitee,甚至可以让别人下载好了打包发你一份。



cd AiPi-Open-Kits

cd 是change directory的简写,把当前目录改为目标目录,就是进入到某个文件夹内。

这一步只是为下面操作做准备。



git submodule init

git submodule update

简单百度一下发现,这是初始化子仓库,更新子仓库。

那么其作用跟clone一样都是把源码下载到本地。为什么需要这个呢,因为AiPi-Open-Kits使用了子仓库,可以简单认为这个仓库引用了其它仓库,所以还要更新引用的其它仓库。



. install.sh

. export.sh



. install.sh(点空格)跟source install.sh 作用是一样的。

是在当前环境下执行脚本,正常执行脚本,退出后脚本内设置的环境变量,函数定义等,都会清掉。为了让脚本内定义的内容能保留到当前环境下,才使用这种方式。

举个简单的例子,某脚本内容为 cd /data && echo ”in data”,用source执行后当前所在目录应该是data目录,正常执行的话,则目录不会改变。



install.sh 的内容
1.png
判断当前是否存在toolchain/bin目录,存在则输出该目录,
不存在则执行初始化子仓库,更新子仓库。
cd ..是进入上一级目录,$PWD是当前目录。
先进入toolchain/bin,再把当前目录(就是toolchain/bin)赋值到PATH最后面,之后回到原来目录。

判断没有toolchain/bin目录就更新子仓库,很容易想到toolchain就是子仓库的内容。
也很容易想到这个install只需要操作一次,因为以后就会有toolchain/bin目录而跳过。
而把toolchain/bin添加到PATH目录的操作没有意义,是会直接跳过的,倘若后面的操作需要依赖这一步,那就只是埋雷。

export.sh内容
2.png
第1行,又是把toolchain/bin添加到PATH目录,所以又一次证明了install那边的添加操作无意义。
第2行,显示当前PATH
第3行,显示riscv64-unknown-elf-gcc 工具的版本号
后面就是给几个路径的文件添加权限。这里我们肯定不会去修改这些文件,所以实际上需要的主要是执行权限,用chmod +x 文件名,效果也是一样的。
添加执行权限后,下次不需要再次添加。
而这里的添加到PATH目录,只是个临时修改,所以下次还需要再次执行。Windows可以通过环境变量修改,自己把toolchain/bin加进去。Linux可以修改~/.bashrc文件把这行命令加进去,避免每次开机或打开terminate都要执行export.sh脚本。
添加的目的是可以直接通过文件名执行,如果后面出现找不到xx文件,有可能就是缺少了添加到PATH这一步。
如果出现权限不足,可能就是没有给执行权限。

总结下来,搭建环境只做了3件事:
1、拉代码
2、工具添加到PATH
3、工具添加执行权限
只要做到这几个事,用什么方法都是可以的。

搭建过程过于简单,所以再水一水编译过程吧


二、编译过程
cd 对应Demo目录文件夹
make                          //编译命令
make flash COMX=/dev/ttyUSB0  //烧录命令

进入demo文件夹
执行make命令,make命令是做什么的?
根据我们用到的,先来写一个例子
3.png

写一个Makefile文件如上,有3个分支。
在当前目录上打开cmd,添加好命令路径。

直接执行make,会输出 1 axk zdzq
make不带参数时,会执行第1个分支的内容

由于第2个分支冒号后面加上了第一个分支名,
执行 make gouge FLAG="niu bi" 执行第2分支时,会先执行第1个分支的内容,第二个分支时使用了变量FLAG,是我们make时给的niu bi内容。

第3个分支,同样冒号后有分支2,所以会先执行分支2,递归下去就1、2、3逐个执行。而变量LABEL使用了默认值yuangzhang(拼错了)。

所以第4个命令,手动输入LABEL=”ai xiao”,之后,输出了新的内容。
4.png
简单总结下:
make xx就会执行xx分支的内容,如果xx分支依赖其它分支,则会先执行其它分支。
不带参数就执行第一个分支。
make时可以带变量

再回到编译过程,例子执行了make和make flash,所以执行了第一个分支,之后又执行了flash分支。
通过makefile文件可以看出,第一个分支是build,而flash分支会执行一次build,
所以实际上如果你对代码有自信,可以直接执行flash,不用build。

未完待续...
如果有人看再更新吧


回复

使用道具 举报

爱笑 | 2024-1-15 17:24:54 | 显示全部楼层
必须有人看!
用心做好保姆工作
回复 支持 反对

使用道具 举报

1084504793 | 2024-1-15 18:44:32 | 显示全部楼层
回复

使用道具 举报

干簧管 | 2024-1-15 19:29:18 | 显示全部楼层
回复

使用道具 举报

timo | 2024-1-15 21:10:39 | 显示全部楼层
回复

使用道具 举报

san | 2024-1-15 23:39:41 | 显示全部楼层
回复

使用道具 举报

WT_0213 | 2024-1-16 09:01:51 | 显示全部楼层
来看了
回复

使用道具 举报

bzhou830 | 2024-1-16 09:23:47 | 显示全部楼层
来看了
选择去发光,而不是被照亮
回复

使用道具 举报

lazy | 2024-1-16 09:24:13 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则