2. SDK编译环境搭建¶
海思官方建议Linux4.19_SDK使用的编译主机Linux系统为Ubuntu18.04 LTS,而HiSpark社区建议Linux6.6_SDK使用Ubuntu22.04 LTS。
综合需求和实际开发验证,LubanCat_Hi3403的开发过程中使用的环境为Ubuntu20.04,可以兼顾两个版本SDK的开发。建议用户使用Ubuntu20.04,与LubanCat开发环境保持一致。
2.1. Linux系统配置¶
需要对Linux系统环境进行配置,设置环境变量,安装依赖软件包等
配置默认shell解释器为bash
1 | sudo dpkg-reconfigure dash
|
执行命令后弹出的对话框选择 否
如果没有配置,在编译时会报错找不到 pushd 命令
安装软件包
1 2 3 4 5 6 7 8 9 | # 更新软件包列表
sudo apt update -y
# 安装软件包
sudo apt install -y make libc6-i386 lib32z1 lib32stdc++6 zlib1g-dev \
libncurses5-dev ncurses-term libncursesw5-dev g++ u-boot-tools texinfo \
gawk libssl-dev openssl bc p7zip-full gperf bison flex diffutils git \
unzip python3-pip libffi-dev libtool libfreetype6 fakeroot autopoint \
po4a wget vim openssh-server net-tools cpio rsync expect
|
创建/etc/ld.so.preload文件
1 2 | # 解决64bit Linux server上某些第三方库编译失败的问题
sudo bash -c "echo '' > /etc/ld.so.preload"
|
安装python3.x.x、 pip3、 wheel、 pycryptodome、pyelftools库
1 2 3 | sudo pip3 install wheel -i https://pypi.tuna.tsinghua.edu.cn/simple
sudo pip3 install pycryptodome -i https://pypi.tuna.tsinghua.edu.cn/simple
sudo pip3 install pyelftools -i https://pypi.tuna.tsinghua.edu.cn/simple
|
设置默认python版本为python3
1 | sudo ln -sf /usr/bin/python3 /usr/bin/python
|
以上是Linux4.19_SDK和Linux6.6_SDK都需要安装的依赖。 由于Linux4.19_SDK还使用了一些第三方开源组件,在编译前还需要安装下面的工具, 如果仅使用Linux6.6_SDK则可以跳过下面依赖的安装。
安装SDK中开源组件mtd-utils依赖
1 2 3 | sudo apt install -y zlib1g-dev liblzo2-dev uuid-dev pkg-config automake
export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/lib/x86_64-linux-gnu/pkgconfig"
|
安装SDK中开源组件e2fsprogs依赖
1 | sudo apt install -y texlive
|
安装LiteOS编译需要的工具,包括python、pip 和 kconfiglib
1 | sudo pip3 install kconfiglib -i https://pypi.tuna.tsinghua.edu.cn/simple
|
2.2. Ubuntu根文件系统构建工具安装¶
如果要使用SDK构建Ubuntu根文件系统镜像,还需要安装Ubuntu项目中的特定版本离线软件包。
Linux4.19_SDK和Linux6.6_SDK使用同样的Ubuntu构建脚本,所以进入任意版本SDK的open_source/ubuntu目录中,运行下面的命令进行安装。
1 2 3 | sudo apt-get install binfmt-support qemu-user-static
sudo dpkg -i ubuntu-build-service/packages/*
sudo apt-get install -f
|
2.3. 交叉编译工具安装¶
根据使用的SDK版本安装对应的交叉编译工具,如果同时使用两个版本的SDK,则都安装。
2.3.1. Linux4.19_SDK¶
2.3.1.1. 安装arm64交叉编译工具¶
从网盘资源 4-SDK源码压缩包/交叉编译环境/LubanCat_Hi3403_Linux4.19_SDK 中获取aarch64-mix210-linux.tgz压缩包, 使用以下命令安装交叉编译工具。
1 2 3 4 5 6 7 8 9 10 | # 解压压缩包
tar -xvf aarch64-mix210-linux.tgz
# 安装
cd aarch64-mix210-linux/
sudo ./aarch64-mix210-linux.install
# 配置环境变量
echo "export PATH="/opt/linux/x86-arm/aarch64-mix210-linux/bin:\$PATH"" >> ~/.bashrc
source ~/.bashrc
|
使用 aarch64-mix210-linux-gcc -v 命令查看aarch64-mix210-linux-gcc的版本,来验证是否安装成功。
出现图中的信息,则说明安装成功
2.3.1.2. 安装riscv交叉编译工具¶
从网盘资源 4-SDK源码压缩包/交叉编译环境/LubanCat_Hi3403_Linux4.19_SDK 中获取cc-riscv32-cfg5-musl-20211008-elf.tar.gz压缩包, 使用以下命令安装交叉编译工具。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # 解压压缩包
tar -xvf cc-riscv32-cfg5-musl-20211008-elf.tar.gz
# 进入install.sh脚本所在目录
cd cc-riscv32-cfg5-musl-20211008-elf/
# 使用脚本安装工具链
./install.sh
# 进入工具链安装目录
cd ./cc-riscv32-cfg5-musl-20211008-elf/
# 获取工具链安装目录路径
pwd
# pwd返回
/home/dev/cc-riscv32-cfg5-musl-20211008-elf/cc-riscv32-cfg5-musl-20211008-elf
# 配置工具链路径
# 用上面获取的路径替换PATH="到/bin:\$PATH"中间的内容
echo "export PATH="/home/dev/cc-riscv32-cfg5-musl-20211008-elf/cc-riscv32-cfg5-musl-20211008-elf/bin:\$PATH"" >> ~/.bashrc
source ~/.bashrc
|
注意,cc-riscv32-cfg5-musl-20211008-elf被安装到了运行install.sh的目录下,设置环境变量时,要设置对应的目录。
使用 riscv32-cfg5-musl-20211008-elf-gcc -v 命令查看riscv32-cfg5-musl-20211008-elf-gcc的版本,来验证是否安装成功。
出现图中的信息,则说明安装成功
2.3.2. Linux6.6_SDK¶
可以访问 https://gitee.com/openeuler/yocto-meta-openeuler/releases 下载 openEuler Embedded Toolchains V0.1.8 中的序号为1到4,名称为openeuler_gcc_arm64le.tar.gz的4个压缩包
也可以从网盘资源 4-SDK源码压缩包/交叉编译环境/LubanCat_Hi3403_Linux6.6_SDK 中获取这4个压缩包。
将交叉编译工具的压缩包传输到编译主机中,使用以下命令安装交叉编译工具。
1 2 3 4 5 6 7 8 9 | # 将拆分的4个压缩包合并为1个
cat 1_openeuler_gcc_arm64le.tar.gz 2_openeuler_gcc_arm64le.tar.gz 3_openeuler_gcc_arm64le.tar.gz 4_openeuler_gcc_arm64le.tar.gz > openeuler_gcc_arm64le.tar.gz
# 解压合并后的压缩包到系统目录
sudo tar -xzf openeuler_gcc_arm64le.tar.gz -C /opt/linux/x86-arm/
# 配置环境变量
echo "export PATH="/opt/linux/x86-arm/openeuler_gcc_arm64le/bin:\$PATH"" >> ~/.bashrc
source ~/.bashrc
|
使用 aarch64-openeuler-linux-gnu-gcc -v 命令查看aarch64-openeuler-linux-gnu-gcc 的版本,来验证是否安装成功。
出现图中的信息,则说明安装成功
2.3.2.1. 安装arm64交叉编译工具¶
2.4. 补全依赖库¶
使用Ubuntu20.04的系统编译SDK,编译时会缺少依赖库,还需要手动安装此依赖库。
从网盘资源 4-SDK源码压缩包/交叉编译环境 中可以获取isl-0.19.tar.xz压缩包
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | # 安装依赖包
sudo apt install -y libgmp-dev
# 下载或使用网盘中的源代码压缩包
wget https://sourceforge.net/projects/libisl/files/isl-0.19.tar.xz/download -O isl-0.19.tar.xz
# 解压压缩包
tar xf isl-0.19.tar.xz
# 编译
cd isl-0.19
./configure --prefix=$HOME/.isl-0.19
make -j$(nproc)
# 安装
make install
# 设置环境变量
echo 'export LD_LIBRARY_PATH="$HOME/.isl-0.19/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"' >> ~/.bashrc
source ~/.bashrc
# 验证
ldd /opt/linux/x86-arm/aarch64-mix210-linux/libexec/gcc/aarch64-linux-gnu/7.3.0/cc1
# 查看libisl.so.19是否指向正确的路径
libisl.so.19 => /home/dev/.isl-0.19/lib/libisl.so.19
|
2.5. 使用Docker一键构建编译环境¶
注解
前4小节操作已经完整搭建了编译环境,无此需求的可以略过本小节
提示
本小节将使用Docker搭建编译环境。在开始操作前,请确保宿主机已正确安装并配置Docker。 Docker相关内容属于独立的技术范畴,本文档不对Docker的安装、配置及基础使用方法进行详细介绍,相关内容请参考Docker官方文档或其他学习资料进行了解。
使用Docker搭建编译环境,可以实现编译环境与宿主机环境的隔离,避免不同开发环境之间的相互影响。 相比传统虚拟机方案,Docker容器具有更轻量、资源占用更低、启动速度更快等优势,尤其适用于需要同时维护多个开发环境的场景。
借助宿主机提供的Docker运行环境,可以快速创建和管理不同版本的开发环境。例如,可以同时部署多个不同版本的Ubuntu、Debian或其他Linux系统的编译环境, 并根据项目需求在不同环境之间快速切换,提高开发和维护效率。
2.5.1. 获取环境搭建资源¶
获取网盘资源 4-SDK源码压缩包/交叉编译环境 中的所有文件并保存到Linux宿主机中,包含以下内容
Dockerfile: 生成Docker镜像的配置文件
isl-0.19.tar.xz: 依赖库源码
LubanCat_Hi3403_Linux4.19_SDK: 交叉编译工具
LubanCat_Hi3403_Linux6.6_SDK: 交叉编译工具
qemu_6.2+dfsg-2ubuntu6_amd64.deb: Ubuntu镜像构建依赖
debootstrap_1.0.126+nmu1_all.deb: Ubuntu镜像构建依赖
README.md: 说明文件
2.5.2. 构建Docker镜像¶
在Linux宿主机中进入 交叉编译环境 目录内,运行下面的命令构建Docker镜像
1 2 3 4 5 6 7 8 | # 使用当前目录下的Dockerfile构建名为ubuntu20.04-hi3403,版本为v1的镜像
sudo docker build -t ubuntu20.04-hi3403:v1 .
# 查看所有Docker镜像
sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu20.04-hi3403 v1 d6721c4574bb 24 hours ago 5.24GB
ubuntu 20.04 6013ae1a63c2 21 months ago 72.8MB
|
2.5.3. 创建并运行Docker容器¶
进入宿主机中存放SDK源码的目录,并使用以下命令运行Docker容器
1 2 3 4 5 6 7 8 9 10 11 12 13 | # 获取SDK绝对路径
dev@localhost:pwd
# 返回
dev@localhost:/home/dev/LubanCat_Hi3403_Linux_SDK
# 运行docker容器,并将SDK所在的目录挂载到容器的/home/dev/workdir目录
dev@localhost:sudo docker run --privileged -v /home/dev/LubanCat_Hi3403_Linux_SDK:/home/dev/workdir:rw -it ubuntu20.04-hi3403:v1 /bin/bash
# 进入SDK所在目录
dev@5f96633e5a48:cd /home/dev/workdir
# 退出容器
dev@5f96633e5a48:exit
|
docker run: 运行docker容器
–privileged: 特权模式
-v: 挂载存储,第一个:前为宿主机路径,第一个:后为容器中的路径。rw表示挂载为可读可写模式
-it: 交互模式
ubuntu20.04-hi3403:v1: 使用的docker镜像
/bin/bash: 交互模式时使用的shell解释器
dev@localhost: 表示在宿主机终端执行命令
dev@5f96633e5a48: 表示在docker容器中执行命令。后面的数字是容器的ID。
一些宿主机中常用的Docker操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # 查看所有容器,包括已经停止运行的
sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5f96633e5a48 ubuntu20.04-hi3403:v1 "/bin/bash" 49 minutes ago Exited (2) About a minute ago jovial_wilson
# 重新运行停止运行的容器
sudo docker start 5f96633e5a48
# 重新以交互模式进入运行的容器
sudo docker exec -it 5f96633e5a48 /bin/bash
# 停止正在运行的容器
sudo docker stop 5f96633e5a48
# 删除停止运行的容器
sudo docker rm 5f96633e5a48
|
以上就完成了Docker编译环境的搭建,在Docker容器中编译SDK的命令与在普通Linux系统中的命令一致。
