交叉编译
1.编译环境
C++程序要在板端运行,是需要对依赖文件进行编译的(也可以直接使用提供的可执行文件)。这里为了节省边缘设备的压力,选择使用一个X86的linux环境进行交叉编译(例子使用WSL进行,关于WSL的使用可以查看官方文档)。
搭建交叉编译环境,这里提供两种方式:
(1)通过apt安装交叉编译工具链:
如果您的系统和目标SoC平台的libc版本相同(可通过ldd --version
命令进行查询),那么您可以使用如下命令安装:
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
卸载方法:
sudo apt remove cpp-*-aarch64-linux-gnu
如果您的环境不满足上述要求,建议使用第(2)种方法。
(2)通过docker搭建交叉编译环境:
可以使用我们提供的docker镜像--stream_dev.tar
作为交叉编译环境。
#安装dfss下载工具
pip3 install dfss
#安装docker镜像
python3 -m dfss --url=open@sophgo.com:sophon-demo/common/docker/stream_dev.tar # ubuntu 20.04, gcc-9
如果是首次使用Docker, 可执行下述命令进行安装和配置(仅首次执行需要该操作):
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker
在下载好的镜像目录中加载镜像
docker load -i stream_dev.tar
可以通过docker images
查看加载好的镜像,默认为stream_dev:latest
。
创建容器
docker run --privileged --name stream_dev -v $PWD:/workspace -it stream_dev:latest
# stream_dev只是举个名字的例子, 请指定成自己想要的容器的名字
#已有docker容器可通过下面命令打开
docker run -v $PWD:/workspace -it stream_dev:latest
容器中的workspace
目录会挂载到您运行docker run
时所在的宿主机目录,您可以在此容器中编译项目。workspace目录在根目录下,该目录下的改动会映射到本地目录中对应文件的改动。
注意:创建容器时需要到soc-sdk(依赖编译环境)的父目录以及以上目录
2.打包依赖文件
2.1.打包libsophon
对libsophon_soc_x.y.z_aarch64.tar.gz,x.y.z表示版本号,并进行解压。
文件可在SDK包的该路径下找到:SDK-23.09-LTS-SP4\SDK-23.09-LTS-SP4\sophon-img_20241227_105055
,可通过命令下载SDK包
#可通过命令下载SDK包(有libsophon_soc_x.y.z_aarch64.tar.gz文件可跳过此操作)
wget https://sophon-assets.sophon.cn/sophon-prod-s3/drive/24/12/31/10/SDK-23.09-LTS-SP4.zip
# 创建依赖文件的根目录
mkdir -p soc-sdk
# 解压libsophon_soc_x.y.z_aarch64.tar.gz
tar -zxf libsophon_soc_${x.y.z}_aarch64.tar.gz
# 将相关的库目录和头文件目录拷贝到依赖文件根目录下
cp -rf libsophon_soc_${x.y.z}_aarch64/opt/sophon/libsophon-${x.y.z}/lib soc-sdk
cp -rf libsophon_soc_${x.y.z}_aarch64/opt/sophon/libsophon-${x.y.z}/include soc-sdk
2.2.打包sophon-ffmpeg和sophon-opencv
对sophon-mw-soc_x.y.z_aarch64.tar.gz,x.y.z表示版本号,并进行解压。
文件可在SDK包的该路径下找到:SDK-23.09-LTS-SP4\SDK-23.09-LTS-SP4\sophon-mw_20241223_163201
# 解压sophon-mw-soc_x.y.z_aarch64.tar.gz
tar -zxf sophon-mw-soc_${x.y.z}_aarch64.tar.gz
# 将ffmpeg和opencv的库目录和头文件目录拷贝到soc-sdk目录下
cp -rf sophon-mw-soc_${x.y.z}_aarch64/opt/sophon/sophon-ffmpeg_${x.y.z}/lib soc-sdk
cp -rf sophon-mw-soc_${x.y.z}_aarch64/opt/sophon/sophon-ffmpeg_${x.y.z}/include soc-sdk
cp -rf sophon-mw-soc_${x.y.z}_aarch64/opt/sophon/sophon-opencv_${x.y.z}/lib soc-sdk
cp -rf sophon-mw-soc_${x.y.z}_aarch64/opt/sophon/sophon-opencv_${x.y.z}/include soc-sdk
3.进行交叉编译
bmcv模式
交叉编译环境搭建好后,使用交叉编译工具链编译生成可执行文件,这里以sophon-demo中的YOLOv5的C++例程为例。
cd cpp/yolov5_opencv
mkdir build && cd build
#请根据实际情况修改-DSDK的路径,需使用绝对路径。
cmake -DTARGET_ARCH=soc -DSDK=/workspace/soc-sdk/ ..
make
编译完成后在对应的目录会生成.soc
文件,例如如:cpp/yolov5_bmcv/yolov5_bmcv.soc
。
sail模式
如果您使用sophon-sail接口,需要先给soc环境(即开发板环境)配置sophon-sail。配置方法如下:
配置sail环境
通过交叉编译的方式(这里例子使用WSL进行),编译出包含bmcv,sophon-ffmpeg,sophon-opencv
的SAIL。
如编译平台libc版本与目标版本不同则需要进入docker环境
docker run -v $PWD:/workspace -it stream_dev:latest
#解压sophon-sail_3.8.0.tar.gz
tar -zvxf sophon-sail_3.8.0.tar.gz
#进入到sophon目录下:cd sophon
mkdir build && cd build
cmake -DBUILD_TYPE=soc -DBUILD_PYSAIL=OFF -DCMAKE_TOOLCHAIN_FILE=../cmake/BM168x_SOC/ToolChain_aarch64_linux.cmake -DLIBSOPHON_BASIC_PATH=../../libsophon_soc_0.5.1-LTS_aarch64/opt/sophon/libsophon-0.5.1/ -DFFMPEG_BASIC_PATH=../../sophon-mw-soc_0.12.0_aarch64/opt/sophon/sophon-ffmpeg_0.12.0/ -DOPENCV_BASIC_PATH=../../sophon-mw-soc_0.12.0_aarch64/opt/sophon/sophon-opencv_0.12.0/ ..
make sail
安装SAIL动态库及头文件,程序将自动在源码目录下创建build_soc
,编译结果将安装在build_soc
下面
make install
将build_soc
文件夹下的sophon-sail
拷贝至目标SOC的/opt/sophon
目录下,即可在soc上面进行调用。
交叉编译环境搭建好后,使用交叉编译工具链编译生成可执行文件。
cd cpp/yolov5_sail
mkdir build && cd build
#请根据实际情况修改-DSDK和-DSAIL_PATH的路径,需使用绝对路径。
cmake -DTARGET_ARCH=soc -DSDK=/path_to_sdk/soc-sdk -DSAIL_PATH=/wrokspace/sophon-sail/build_soc/sophon-sail ..
make
编译完成后,会在yolov5_sail
目录下生成yolov5_sail.soc
。
因为这里移动sophon-sail
到的是/opt/sophon
目录,如果使用ssh连接进行文件传送需要进入root账户下。root账户无初始密码,使用前需要先用linaro账户做sudo passwd root设置密码。
一般linux系统是默认禁止远程登录root用户,需要进行下面操作:
编辑配置文件
sudo vim /etc/ssh/sshd_config
#文件中加入
PermitRootLogin yes
退出并保存,重启ssh
sudo service sshd restart
在您按照教程将sophon-sail的库文件拷贝到目标soc上之后,您还需要设置以下环境变量:
echo 'export LD_LIBRARY_PATH=/opt/sophon/sophon-sail/lib/:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc