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
1sudo dpkg-reconfigure dash
执行命令后弹出的对话框选择 否
如果没有配置,在编译时会报错找不到 pushd 命令
安装软件包
1# 更新软件包列表
2sudo apt update -y
3
4# 安装软件包
5sudo apt install -y make libc6-i386 lib32z1 lib32stdc++6 zlib1g-dev \
6libncurses5-dev ncurses-term libncursesw5-dev g++ u-boot-tools texinfo \
7gawk libssl-dev openssl bc p7zip-full gperf bison flex diffutils git \
8unzip python3-pip libffi-dev libtool libfreetype6 fakeroot autopoint \
9po4a wget vim openssh-server net-tools cpio rsync expect
创建/etc/ld.so.preload文件
1# 解决64bit Linux server上某些第三方库编译失败的问题
2sudo bash -c "echo '' > /etc/ld.so.preload"
安装python3.x.x、 pip3、 wheel、 pycryptodome、pyelftools库
1sudo pip3 install wheel -i https://pypi.tuna.tsinghua.edu.cn/simple
2sudo pip3 install pycryptodome -i https://pypi.tuna.tsinghua.edu.cn/simple
3sudo pip3 install pyelftools -i https://pypi.tuna.tsinghua.edu.cn/simple
设置默认python版本为python3
1sudo ln -sf /usr/bin/python3 /usr/bin/python
以上是Linux4.19_SDK和Linux6.6_SDK都需要安装的依赖。 由于Linux4.19_SDK还使用了一些第三方开源组件,在编译前还需要安装下面的工具, 如果仅使用Linux6.6_SDK则可以跳过下面依赖的安装。
安装SDK中开源组件mtd-utils依赖
1sudo apt install -y zlib1g-dev liblzo2-dev uuid-dev pkg-config automake
2
3export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/lib/x86_64-linux-gnu/pkgconfig"
安装SDK中开源组件e2fsprogs依赖
1sudo apt install -y texlive
安装LiteOS编译需要的工具,包括python、pip 和 kconfiglib
1sudo 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目录中,运行下面的命令进行安装。
1sudo apt-get install binfmt-support qemu-user-static
2sudo dpkg -i ubuntu-build-service/packages/*
3sudo 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# 解压压缩包
2tar -xvf aarch64-mix210-linux.tgz
3
4# 安装
5cd aarch64-mix210-linux/
6sudo ./aarch64-mix210-linux.install
7
8# 配置环境变量
9echo "export PATH="/opt/linux/x86-arm/aarch64-mix210-linux/bin:\$PATH"" >> ~/.bashrc
10source ~/.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# 解压压缩包
2tar -xvf cc-riscv32-cfg5-musl-20211008-elf.tar.gz
3
4# 进入install.sh脚本所在目录
5cd cc-riscv32-cfg5-musl-20211008-elf/
6
7# 使用脚本安装工具链
8./install.sh
9
10# 进入工具链安装目录
11cd ./cc-riscv32-cfg5-musl-20211008-elf/
12
13# 获取工具链安装目录路径
14pwd
15# pwd返回
16/home/dev/cc-riscv32-cfg5-musl-20211008-elf/cc-riscv32-cfg5-musl-20211008-elf
17
18# 配置工具链路径
19# 用上面获取的路径替换PATH="到/bin:\$PATH"中间的内容
20echo "export PATH="/home/dev/cc-riscv32-cfg5-musl-20211008-elf/cc-riscv32-cfg5-musl-20211008-elf/bin:\$PATH"" >> ~/.bashrc
21source ~/.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# 将拆分的4个压缩包合并为1个
2cat 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
3
4# 解压合并后的压缩包到系统目录
5sudo tar -xzf openeuler_gcc_arm64le.tar.gz -C /opt/linux/x86-arm/
6
7# 配置环境变量
8echo "export PATH="/opt/linux/x86-arm/openeuler_gcc_arm64le/bin:\$PATH"" >> ~/.bashrc
9source ~/.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# 安装依赖包
2sudo apt install -y libgmp-dev
3
4# 下载或使用网盘中的源代码压缩包
5wget https://sourceforge.net/projects/libisl/files/isl-0.19.tar.xz/download -O isl-0.19.tar.xz
6
7# 解压压缩包
8tar xf isl-0.19.tar.xz
9
10# 编译
11cd isl-0.19
12./configure --prefix=$HOME/.isl-0.19
13make -j$(nproc)
14
15# 安装
16make install
17
18# 设置环境变量
19echo 'export LD_LIBRARY_PATH="$HOME/.isl-0.19/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"' >> ~/.bashrc
20source ~/.bashrc
21
22# 验证
23ldd /opt/linux/x86-arm/aarch64-mix210-linux/libexec/gcc/aarch64-linux-gnu/7.3.0/cc1
24# 查看libisl.so.19是否指向正确的路径
25libisl.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# 使用当前目录下的Dockerfile构建名为ubuntu20.04-hi3403,版本为v1的镜像
2sudo docker build -t ubuntu20.04-hi3403:v1 .
3
4# 查看所有Docker镜像
5sudo docker images
6REPOSITORY TAG IMAGE ID CREATED SIZE
7ubuntu20.04-hi3403 v1 d6721c4574bb 24 hours ago 5.24GB
8ubuntu 20.04 6013ae1a63c2 21 months ago 72.8MB
2.5.3. 创建并运行Docker容器#
进入宿主机中存放SDK源码的目录,并使用以下命令运行Docker容器
1# 获取SDK绝对路径
2dev@localhost:pwd
3# 返回
4dev@localhost:/home/dev/LubanCat_Hi3403_Linux_SDK
5
6# 运行docker容器,并将SDK所在的目录挂载到容器的/home/dev/workdir目录
7dev@localhost:sudo docker run --privileged -v /home/dev/LubanCat_Hi3403_Linux_SDK:/home/dev/workdir:rw -it ubuntu20.04-hi3403:v1 /bin/bash
8
9# 进入SDK所在目录
10dev@5f96633e5a48:cd /home/dev/workdir
11
12# 退出容器
13dev@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# 查看所有容器,包括已经停止运行的
2sudo docker ps -a
3CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
45f96633e5a48 ubuntu20.04-hi3403:v1 "/bin/bash" 49 minutes ago Exited (2) About a minute ago jovial_wilson
5
6# 重新运行停止运行的容器
7sudo docker start 5f96633e5a48
8
9# 重新以交互模式进入运行的容器
10sudo docker exec -it 5f96633e5a48 /bin/bash
11
12# 停止正在运行的容器
13sudo docker stop 5f96633e5a48
14
15# 删除停止运行的容器
16sudo docker rm 5f96633e5a48
以上就完成了Docker编译环境的搭建,在Docker容器中编译SDK的命令与在普通Linux系统中的命令一致。