2. 编译安装指南

2.1. 源码目录结构

源码的目录结构如下:

 sophon-sail/
 |── 3rdparty
 |   ├── prebuild
 |   ├── pybind11
 |   └── spdlog
 |── cmake                     # Cmake Files
 |── docs                      # Documentation codes
 |── include                   # Includes
 |── python                    # Wheel codes
 |   ├── arm_pcie
 |   ├── pcie
 |   └── soc
 |── python_wheels             # Python Wheels
 |   ├── arm_pcie
 |   └── soc
 |── sample                    # Sample files
└── src                       # Source codes

其中3rdparty主要包含了编译sail需要依赖的第三方的一些头文件; cmake中是编译用到的一些cmake文件; include是sail的一些头文件; python文件夹内包含了以下各平台下面python wheel的打包代码及脚本; python_wheels文件夹内是一些预编译出来的wheel包,arm_pcie和soc两个文件夹分别是对应的平台; sample文件夹内是一些示例程序; src文件夹下面是各接口的实现代码。

2.2. SAIL的编译及安装

2.2.1. 编译参数

  • BUILD_TYPE : 编译的类型,目前有pcie和soc两种模式,pcie是编译在x86主机上可用的SAIL包,soc表示使用交叉编译的方式,在x86主机上编译soc上可用的SAIL包,arm_pcie表示使用交叉编译的方式,在x86主机上编译插有bm168x卡的arm主机上可用的SAIL包。默认pcie。

  • ONLY_RUNTIME : 编译结果是否只包含运行时,而不包含bmcv,sophon-ffmpeg,sophon-opencv,如果此编译选项为ON,则SAIL的编解码及Bmcv接口不可用,只有推理接口可用。默认OFF。

  • INSTALL_PREFIX : 执行make install时的安装路径,pcie模式下默认“/opt/sophon”,与libsophon的安装路径一致,交叉编译模式下默认“build_soc”。

  • PYTHON_EXECUTABLE : 编译使用的“python3”的路径名称(路径+名称),默认使用当前系统中默认的python3。

  • CUSTOM_PY_LIBDIR : 编译使用的python3的动态库的路径(只包含路径),默认使用当前系统中默认python3的动态库目录。

  • LIBSOPHON_BASIC_PATH : 交叉编译模式下,libsophon的路径,如果配置不正确则会编译失败。pcie模式下面此编译选项不生效。

  • FFMPEG_BASIC_PATH : 交叉编译模式下,sophon-ffmpeg的路径,如果配置不正确,且ONLY_RUNTIME为“ON”时会编译失败。pcie模式下面此编译选项不生效。

  • OPENCV_BASIC_PATH : 交叉编译模式下,sophon-opencv的路径,如果配置不正确,且ONLY_RUNTIME为“ON”时会编译失败。pcie模式下面此编译选项不生效。

2.2.2. PCIE MODE

.安装libsophon,sophon-ffmpeg,sophon-opencv的SAIL

libsophon,sophon-ffmpeg,sophon-opencv的安装方式可参考算能官方文档

.典型编译方式一

使用默认安装路径,编译包含bmcv,sophon-ffmpeg,sophon-opencv的SAIL

如果不需要使用python接口,可以忽略5、6两个步骤

  1. 下载sophon-sail源码,解压后进入其源码目录

  2. 创建编译文件夹build,并进入build文件夹

    mkdir build && cd build
    
  3. 执行编译命令

    cmake ..
    make
    
  4. 安装SAIL动态库及头文件,编译结果将安装在‘/opt/sophon’下面

    sudo make install
    
  5. 打包生成python wheel,生成的wheel包的路径为‘python/pcie/dist’,文件名为‘sophon-3.4.0-py3-none-any.whl’

    cd ../python/pcie
    chmod +x sophon_pcie_whl.sh
    ./sophon_pcie_whl.sh
    
  6. 安装python wheel

    pip3 install ./dist/sophon-3.4.0-py3-none-any.whl --force-reinstall

.典型编译方式二

使用默认安装路径,编译不包含bmcv,sophon-ffmpeg,sophon-opencv的SAIL,

通过此方式编译出来的SAIL无法使用其Decoder、Bmcv等多媒体相关接口。

如果不需要使用python接口,可以忽略5、6两个步骤

  1. 下载sophon-sail源码,解压后进入其源码目录

  2. 创建编译文件夹build,并进入build文件夹

    mkdir build && cd build
    
  3. 执行编译命令

    cmake -DONLY_RUNTIME=ON ..
    make
    
  4. 安装SAIL动态库及头文件,编译结果将安装在‘/opt/sophon’下面

    sudo make install
    
  5. 打包生成python wheel,生成的wheel包的路径为‘python/pcie/dist’,文件名为‘sophon-3.4.0-py3-none-any.whl’

    cd ../python/pcie
    chmod +x sophon_pcie_whl.sh
    ./sophon_pcie_whl.sh
    
  6. 安装python wheel

    pip3 install ./dist/sophon-3.4.0-py3-none-any.whl --force-reinstall

.典型编译方式三

如果生产环境与开发环境上的python3版本不一致,可以通过升级python3版本使其保持一致, 也可以通过python3的官方网站获取获取相应的python3包, 或者从[此链接](http://219.142.246.77:65000/sharing/8MlSKnV8x)下载已经编译好的python3。 也就是使用非系统默认的python3,编译包含bmcv,sophon-ffmpeg,sophon-opencv的SAIL,并打包到‘build_pcie’目录下, 本示例使用的python3路径为‘python_3.8.2/bin/python3’,python3的动态库目录‘python_3.8.2/lib’。

如果不需要使用python接口,可以忽略6、7两个步骤,在步骤3中也可以不指定PYTHON_EXECUTABLE和CUSTOM_PY_LIBDIR

  1. 下载sophon-sail源码,解压后进入其源码目录

  2. 创建编译文件夹build,并进入build文件夹

    mkdir build && cd build
    
  3. 执行编译命令

    cmake -DINSTALL_PREFIX=../build_pcie -DPYTHON_EXECUTABLE=python_3.8.2/bin/python3 -DCUSTOM_PY_LIBDIR=python_3.8.2/lib ..
    make
    
  4. 安装SAIL动态库及头文件,程序将自动在源码目录下创建‘build_pcie’,编译结果将安装在‘build_pcie’下面

    make install
    
  5. 将‘build_pcie’文件夹下的‘sophon-sail’拷贝至生产机器上的‘/opt/sophon’目录下,然后返回编译机器进行后续操作

  6. 打包生成python wheel,生成的wheel包的路径为‘python/pcie/dist’,文件名为‘sophon-3.4.0-py3-none-any.whl’

    cd ../python/pcie
    chmod +x sophon_pcie_whl.sh
    ./sophon_pcie_whl.sh
    
  7. 安装python wheel

将‘sophon-3.4.0-py3-none-any.whl’拷贝到目标机器上,然后执行如下安装命令

pip3 install ./dist/sophon-3.4.0-py3-none-any.whl --force-reinstall

2.2.3. SOC MODE

.获取交叉编译需要使用的libsophon,sophon-ffmpeg,sophon-opencv

此章节所有的编译操作都是在x86主机上,使用交叉编译的方式进行编译。下面示例中选择libsophon的版本为0.4.1, sophon-ffmpeg的版本为0.4.1,sophon-opencv的版本为0.4.1。

  1. 从算能官网中获取‘libsophon_soc_0.4.1_aarch64.tar.gz’,并解压

    tar -xvf libsophon_soc_0.4.1_aarch64.tar.gz
    

解压后libsophon的目录为‘libsophon_soc_0.4.1_aarch64/opt/sophon/libsophon-0.4.1’

  1. 从算能官网中获取‘sophon-mw-soc_0.4.1_aarch64.tar.gz’,并解压

    tar -xvf sophon-mw-soc_0.4.1_aarch64.tar.gz
    

解压后sophon-ffmpeg的目录为‘sophon-mw-soc_0.4.1_aarch64/opt/sophon/sophon-ffmpeg_0.4.1’。

解压后sophon-opencv的目录为‘sophon-mw-soc_0.4.1_aarch64/opt/sophon/sophon-opencv_0.4.1’。

.安装gcc-aarch64-linux-gnu工具链

如果已经安装,可忽略此步骤

sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

.典型编译方式一

使用指定版本的python3(和目标SOC上的python3保持一致),通过交叉编译的方式,编译出包含bmcv,sophon-ffmpeg,sophon-opencv的SAIL, python3的安装方式可通过python官方网站获取, 也可以从[此链接](http://219.142.246.77:65000/sharing/8MlSKnV8x)下载已经编译好的python3。 本示例使用的python3路径为‘python_3.8.2/bin/python3’,python3的动态库目录‘python_3.8.2/lib’。

如果不需要使用python接口,可以忽略6、7两个步骤

  1. 下载sophon-sail源码,解压后进入其源码目录

  2. 创建编译文件夹build,并进入build文件夹

    mkdir build && cd build
    
  3. 执行编译命令

    cmake -DBUILD_TYPE=soc  \
        -DCMAKE_TOOLCHAIN_FILE=../cmake/BM168x_SOC/ToolChain_aarch64_linux.cmake \
        -DPYTHON_EXECUTABLE=python_3.8.2/bin/python3 \
        -DCUSTOM_PY_LIBDIR=python_3.8.2/lib \
        -DLIBSOPHON_BASIC_PATH=libsophon_soc_0.4.1_aarch64/opt/sophon/libsophon-0.4.1 \
        -DFFMPEG_BASIC_PATH=sophon-mw-soc_0.4.1_aarch64/opt/sophon/sophon-ffmpeg_0.4.1 \
        -DOPENCV_BASIC_PATH=sophon-mw-soc_0.4.1_aarch64/opt/sophon/sophon-opencv_0.4.1 ..
    make
  4. 安装SAIL动态库及头文件,程序将自动在源码目录下创建‘build_soc’,编译结果将安装在‘build_soc’下面

    make install
    
  5. 将‘build_soc’文件夹下的‘sophon-sail’拷贝至目标SOC的‘/opt/sophon’目录下,然后返回编译机器进行后续操作

  6. 打包生成python wheel,生成的wheel包的路径为‘python/soc/dist’,文件名为‘sophon_arm-3.4.0-py3-none-any.whl’

    cd ../python/soc
    chmod +x sophon_soc_whl.sh
    ./sophon_soc_whl.sh
    
  7. 安装python wheel

将‘sophon_arm-3.4.0-py3-none-any.whl’拷贝到目标SOC上,然后执行如下安装命令

pip3 install sophon_arm-3.4.0-py3-none-any.whl --force-reinstall

.典型编译方式二

使用指定版本的python3(和目标SOC上的python3保持一致),通过交叉编译的方式,编译出不包含bmcv,sophon-ffmpeg,sophon-opencv的SAIL, python3的安装方式可通过python官方网站获取, 也可以从[此链接](http://219.142.246.77:65000/sharing/8MlSKnV8x)下载已经编译好的python3。 本示例使用的python3路径为‘python_3.8.2/bin/python3’,python3的动态库目录‘python_3.8.2/lib’。

通过此方式编译出来的SAIL无法使用其Decoder、Bmcv等多媒体相关接口。

如果不需要使用python接口,可以忽略6、7两个步骤

  1. 下载sophon-sail源码,解压后进入其源码目录

  2. 创建编译文件夹build,并进入build文件夹

    mkdir build && cd build
    
  3. 执行编译命令

    cmake -DBUILD_TYPE=soc  \
        -DONLY_RUNTIME=ON \
        -DCMAKE_TOOLCHAIN_FILE=../cmake/BM168x_SOC/ToolChain_aarch64_linux.cmake \
        -DPYTHON_EXECUTABLE=python_3.8.2/bin/python3 \
        -DCUSTOM_PY_LIBDIR=python_3.8.2/lib \
        -DLIBSOPHON_BASIC_PATH=libsophon_soc_0.4.1_aarch64/opt/sophon/libsophon-0.4.1 ..
    make
  4. 安装SAIL动态库及头文件,程序将自动在源码目录下创建‘build_soc’,编译结果将安装在‘build_soc’下面

    make install
    
  5. 将‘build_soc’文件夹下的‘sophon-sail’拷贝至目标SOC的‘/opt/sophon’目录下,然后返回编译机器进行后续操作

  6. 打包生成python wheel,生成的wheel包的路径为‘python/soc/dist’,文件名为‘sophon_arm-3.4.0-py3-none-any.whl’

    cd ../python/soc
    chmod +x sophon_soc_whl.sh
    ./sophon_soc_whl.sh
    
  7. 安装python wheel

将‘sophon_arm-3.4.0-py3-none-any.whl’拷贝到目标SOC上,然后执行如下安装命令

pip3 install sophon_arm-3.4.0-py3-none-any.whl --force-reinstall

2.2.4. ARM PCIE MODE

.获取交叉编译需要使用的libsophon,sophon-ffmpeg,sophon-opencv

此章节所有的编译操作都是在x86主机上,使用交叉编译的方式进行编译。下面示例中选择libsophon的版本为0.4.1, sophon-ffmpeg的版本为0.4.1,sophon-opencv的版本为0.4.1。

  1. 从算能官网中获取‘libsophon_0.4.1_aarch64.tar.gz’,并解压

    tar -xvf libsophon_0.4.1_aarch64.tar.gz
    

解压后libsophon的目录为‘libsophon_0.4.1_aarch64/opt/sophon/libsophon-0.4.1’

  1. 从算能官网中获取‘sophon-mw_0.4.1_aarch64.tar.gz’,并解压

    tar -xvf sophon-mw_0.4.1_aarch64.tar.gz
    

解压后sophon-ffmpeg的目录为‘sophon-mw_0.4.1_aarch64/opt/sophon/sophon-ffmpeg_0.4.1’。

解压后sophon-opencv的目录为‘sophon-mw_0.4.1_aarch64/opt/sophon/sophon-opencv_0.4.1’。

.安装gcc-aarch64-linux-gnu工具链

如果已经安装,可忽略此步骤

sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

.典型编译方式一

使用指定版本的python3(和目标ARM主机上的python3保持一致),通过交叉编译的方式,编译出包含bmcv,sophon-ffmpeg,sophon-opencv的SAIL, python3的安装方式可通过python官方网站获取, 也可以从[此链接](http://219.142.246.77:65000/sharing/8MlSKnV8x)下载已经编译好的python3。 本示例使用的python3路径为‘python_3.8.2/bin/python3’,python3的动态库目录‘python_3.8.2/lib’。

如果不需要使用python接口,可以忽略6、7两个步骤

  1. 下载sophon-sail源码,解压后进入其源码目录

  2. 创建编译文件夹build,并进入build文件夹

    mkdir build && cd build
    
  3. 执行编译命令

    cmake -DBUILD_TYPE=arm_pcie  \
        -DCMAKE_TOOLCHAIN_FILE=../cmake/BM168x_ARM_PCIE/ToolChain_aarch64_linux.cmake \
        -DPYTHON_EXECUTABLE=python_3.8.2/bin/python3 \
        -DCUSTOM_PY_LIBDIR=python_3.8.2/lib \
        -DLIBSOPHON_BASIC_PATH=libsophon_0.4.1_aarch64/opt/sophon/libsophon-0.4.1 \
        -DFFMPEG_BASIC_PATH=sophon-mw_0.4.1_aarch64/opt/sophon/sophon-ffmpeg_0.4.1 \
        -DOPENCV_BASIC_PATH=sophon-mw_0.4.1_aarch64/opt/sophon/sophon-opencv_0.4.1 ..
    make
  4. 安装SAIL动态库及头文件,程序将自动在源码目录下创建‘build_arm_pcie’,编译结果将安装在‘build_arm_pcie’下面

    make install
    
  5. 将‘build_arm_pcie’文件夹下的‘sophon-sail’拷贝至目标ARM主机的‘/opt/sophon’目录下,然后返回编译机器进行后续操作

  6. 打包生成python wheel,生成的wheel包的路径为‘python/arm_pcie/dist’,文件名为‘sophon_arm_pcie-3.4.0-py3-none-any.whl’

    cd ../python/arm_pcie
    chmod +x sophon_arm_pcie_whl.sh
    ./sophon_arm_pcie_whl.sh
    
  7. 安装python wheel

将‘sophon_arm_pcie-3.4.0-py3-none-any.whl’拷贝到目标ARM主机上,然后执行如下安装命令

pip3 install sophon_arm_pcie-3.4.0-py3-none-any.whl --force-reinstall

.典型编译方式二

使用指定版本的python3(和目标ARM主机上的python3保持一致),通过交叉编译的方式,编译出不包含bmcv,sophon-ffmpeg,sophon-opencv的SAIL, python3的安装方式可通过python官方网站获取, 也可以从[此链接](http://219.142.246.77:65000/sharing/8MlSKnV8x)下载已经编译好的python3。 本示例使用的python3路径为‘python_3.8.2/bin/python3’,python3的动态库目录‘python_3.8.2/lib’。

通过此方式编译出来的SAIL无法使用其Decoder、Bmcv等多媒体相关接口。

如果不需要使用python接口,可以忽略6、7两个步骤

  1. 下载sophon-sail源码,解压后进入其源码目录

  2. 创建编译文件夹build,并进入build文件夹

    mkdir build && cd build
    
  3. 执行编译命令

    cmake -DBUILD_TYPE=arm_pcie  \
        -DONLY_RUNTIME=ON \
        -DCMAKE_TOOLCHAIN_FILE=../cmake/BM168x_ARM_PCIE/ToolChain_aarch64_linux.cmake \
        -DPYTHON_EXECUTABLE=python_3.8.2/bin/python3 \
        -DCUSTOM_PY_LIBDIR=python_3.8.2/lib \
        -DLIBSOPHON_BASIC_PATH=libsophon_0.4.1_aarch64/opt/sophon/libsophon-0.4.1 ..
    make
  4. 安装SAIL动态库及头文件,程序将自动在源码目录下创建‘build_arm_pcie’,编译结果将安装在‘build_arm_pcie’下面

    make install
    
  5. 将‘build_arm_pcie’文件夹下的‘sophon-sail’拷贝至目标ARM主机的‘/opt/sophon’目录下,然后返回编译机器进行后续操作

  6. 打包生成python wheel,生成的wheel包的路径为‘python/arm_pcie/dist’,文件名为‘sophon_arm_pcie-3.4.0-py3-none-any.whl’

    cd ../python/arm_pcie
    chmod +x sophon_arm_pcie_whl.sh
    ./sophon_arm_pcie_whl.sh
    
  7. 安装python wheel

将‘sophon_arm_pcie-3.4.0-py3-none-any.whl’拷贝到目标ARM主机上,然后执行如下安装命令

pip3 install sophon_arm_pcie-3.4.0-py3-none-any.whl --force-reinstall

2.2.5. 编译用户手册

.安装软件包

# 更新apt
sudo apt update
# 安装latex
sudo apt install texlive-xetex texlive-latex-recommended
# 安装Sphinx
pip3 install sphinx sphinx-autobuild sphinx_rtd_theme rst2pdf
# 安装结巴中文分词库,以支持中文搜索
pip3 install jieba3k

.安装字体

[Fandol](https://ctan.org/pkg/fandol) - Four basic fonts for Chinese typesetting

# 下载Fandol字体
wget http://mirrors.ctan.org/fonts/fandol.zip
# 解压缩字体包
unzip fandol.zip
# 拷贝安装字体包
sudo cp -r fandol /usr/share/fonts/
cp -r fandol ~/.fonts

.执行编译

下载sophon-sail源码,解压后进入其源码的docs目录

cd docs
make pdf

编译好的用户手册路径为‘docs/build/sophon-sail_zh.pdf’

如果编译仍然报错,可以安装以下 ‘sudo apt-get install texlive-lang-chinese’,然后重新执行上述命令。

2.3. 使用SAIL的Python接口进行开发

2.3.1. PCIE MODE

在使用PCIE MODE编译好SAIL,执行安装python wheel之后,即可以使用python中调用SAIL,其接口文档可参考API章节。

2.3.2. SOC MODE

.使用自己编译的Python wheel包

在使用SOC MODE通过交叉编译的方式编译好SAIL之后,将python wheel拷贝到SOC上面进行安装,即可以使用python中调用SAIL,其接口文档可参考API章节。

.使用预编译的Python wheel包

  1. 查看SOC上的libsophon版本和sophon-mw(sophon-ffmpeg,sophon-opencv)的版本

    ls /opt/sophon/
    
  2. 查看SOC上的Python3版本

    python3 --version
    
  3. 从预编译的Python wheel包中找到对应版本的wheel包,将对应的wheel包拷贝到SOC上面进行安装,即可以使用python中调用SAIL,其接口文档可参考API章节。

2.3.3. ARM PCIE MODE

在使用ARM PCIE MODE通过交叉编译的方式编译好SAIL之后,将python wheel拷贝到ARM主机上面进行安装,即可以在python中调用SAIL,其接口文档可参考API章节。

  1. 查看ARM主机上的libsophon版本和sophon-mw(sophon-ffmpeg,sophon-opencv)的版本

    cat /opt/sophon/
    
  2. 查看ARM主机上的Python3版本

    python3 --version
    
  3. 从预编译的Python wheel包中找到对应版本的wheel包,将对应的wheel包拷贝到ARM主机上面进行安装,即可以使用python中调用SAIL,其接口文档可参考API章节。

2.4. 使用SAIL的C++接口进行开发

2.4.1. PCIE MODE

在使用PCIE MODE编译好SAIL,并且通过执行‘sudo make install’或者通过拷贝的方式安装好SAIL的c++库之后, 推荐使用cmake来将SAIL中的库链接到自己的程序中,如果需要使用SAIL多媒体相关的功能, 也需要将libsophon,sophon-ffmpeg,sophon-opencv的头文件目录及动态库目录添加到自己的程序中。 可以在您程序的CMakeLists.txt中添加如下段落:

find_package(libsophon REQUIRED)
include_directories(${LIBSOPHON_INCLUDE_DIRS})
# 添加libsophon的头文件目录

set(SAIL_DIR  /opt/sophon/sophon-sail/lib/cmake)
find_package(SAIL REQUIRED)
include_directories(${SAIL_INCLUDE_DIRS})
link_directories(${SAIL_LIB_DIRS})
# 添加SAIL的头文件及动态库目录

find_package(libsophon REQUIRED)
include_directories(${LIBSOPHON_INCLUDE_DIRS})
# 添加libsophon的头文件目录

set(OpenCV_DIR  /opt/sophon/sophon-opencv-latest/lib/cmake/opencv4)
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
# 添加sophon-opencv的头文件目录

set(FFMPEG_DIR  /opt/sophon/sophon-ffmpeg-latest/lib/cmake)
find_package(FFMPEG REQUIRED)
include_directories(${FFMPEG_INCLUDE_DIRS})
link_directories(${FFMPEG_LIB_DIRS})
# 添加sophon-ffmpeg的头文件及动态库目录

add_executable(${YOUR_TARGET_NAME} ${YOUR_SOURCE_FILES})
target_link_libraries(${YOUR_TARGET_NAME} sail)

在您的代码中即可以调用sail中的函数:

#define USE_FFMPEG  1
#define USE_OPENCV  1
#define USE_BMCV    1

#include <stdio.h>
#include <sail/cvwrapper.h>
#include <iostream>
#include <string>

using namespace std;

int main()
{
    int device_id = 0;
    std::string video_path = "test.avi";
    sail::Decoder decoder(video_path,true,device_id);
    if(!decoder.is_opened()){
        printf("Video[%s] read failed!\n",video_path.c_str());
        exit(1) ;
    }

    sail::Handle handle(device_id);
    sail::Bmcv bmcv(handle);

    while(true){
        sail::BMImage ost_image = decoder.read(handle);
        bmcv.imwrite("test.jpg", ost_image);
        break;
    }

    return 0;
}

2.4.2. SOC MODE

.SOC板卡上编译程序

在SOC板卡上安装好libsophon,sophon-ffmpeg,sophon-opencv,及SAIL之后,您可以参考PCIE MODE的开发方法使用cmake将SAIL中的库链接到自己的程序中, 如果需要使用SAIL多媒体相关的功能, 也需要将libsophon,sophon-ffmpeg,sophon-opencv的头文件目录及动态库目录添加到自己的程序中。

.x86交叉编译程序

如果您希望使用SAIL搭建交叉编译环境,您需要用到libsophon,sophon-ffmpeg,sophon-opencv以及gcc-aarch64-linux-gnu工具链。

.创建‘soc-sdk’文件夹

创建‘soc-sdk’文件夹,后续交叉编译需要用到的头文件及动态库都将存放在此目录中。

mkdir soc-sdk

.获取交叉编译需要使用的libsophon,sophon-ffmpeg,sophon-opencv

下面示例中选择libsophon的版本为0.4.1, sophon-ffmpeg的版本为0.4.1,sophon-opencv的版本为0.4.1。

  1. 从算能官网中获取‘libsophon_soc_0.4.1_aarch64.tar.gz’,并解压拷贝至‘soc-sdk’文件夹

    tar -xvf libsophon_soc_0.4.1_aarch64.tar.gz
    cp -r libsophon_soc_0.4.1_aarch64/opt/sophon/libsophon-0.4.1/include soc-sdk
    cp -r libsophon_soc_0.4.1_aarch64/opt/sophon/libsophon-0.4.1/lib soc-sdk
    

解压后libsophon的目录为‘libsophon_soc_0.4.1_aarch64/opt/sophon/libsophon-0.4.1’

  1. 从算能官网中获取‘sophon-mw-soc_0.4.1_aarch64.tar.gz’,并解压拷贝至‘soc-sdk’文件夹

    tar -xvf sophon-mw-soc_0.4.1_aarch64.tar.gz
    cp -r sophon-mw-soc_0.4.1_aarch64/opt/sophon/sophon-ffmpeg_0.4.1/include soc-sdk
    cp -r sophon-mw-soc_0.4.1_aarch64/opt/sophon/sophon-ffmpeg_0.4.1/lib soc-sdk
    cp -r sophon-mw-soc_0.4.1_aarch64/opt/sophon/sophon-opencv_0.4.1/include/opencv4/opencv2 soc-sdk/include
    cp -r sophon-mw-soc_0.4.1_aarch64/opt/sophon/sophon-opencv_0.4.1/lib soc-sdk
    

.将交叉编译好的SAIL,也即是‘build_soc’拷贝至‘soc-sdk’文件夹

cp build_soc/sophon-sail/include soc-sdk
cp build_soc/sophon-sail/lib soc-sdk

.安装gcc-aarch64-linux-gnu工具链

如果已经安装,可忽略此步骤

sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

上述步骤配置好之后,可以通过配置cmake来完成交叉编译,在您程序的CMakeLists.txt中添加如下段落:

CMakeLists.txt中需要使用‘soc-sdk’的绝对路径为‘/opt/sophon/soc-sdk’,实际应用中需要根据自己实际的位置来进行配置。

set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_ASM_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)

include_directories("/opt/sophon/soc-sdk/include")
include_directories("/opt/sophon/soc-sdk/include/sail")
# 添加交叉编译需要使用的头文件目录

link_directories("/opt/sophon/soc-sdk/lib")
# 添加交叉编译需要使用的动态库目录

add_executable(${YOUR_TARGET_NAME} ${YOUR_SOURCE_FILES})
target_link_libraries(${YOUR_TARGET_NAME} sail)
# sail为需要链接的库

2.4.3. ARM PCIE MODE

.ARM主机上编译程序

在ARM主机上安装好libsophon,sophon-ffmpeg,sophon-opencv,及SAIL之后,您可以参考PCIE MODE的开发方法使用cmake将SAIL中的库链接到自己的程序中, 如果需要使用SAIL多媒体相关的功能, 也需要将libsophon,sophon-ffmpeg,sophon-opencv的头文件目录及动态库目录添加到自己的程序中。

.x86交叉编译程序

如果您希望使用SAIL搭建交叉编译环境,您需要用到libsophon,sophon-ffmpeg,sophon-opencv以及gcc-aarch64-linux-gnu工具链。

.创建‘arm_pcie-sdk’文件夹

创建‘arm_pcie-sdk’文件夹,后续交叉编译需要用到的头文件及动态库都将存放在此目录中。

mkdir arm_pcie-sdk

.获取交叉编译需要使用的libsophon,sophon-ffmpeg,sophon-opencv

下面示例中选择libsophon的版本为0.4.1, sophon-ffmpeg的版本为0.4.1,sophon-opencv的版本为0.4.1。

  1. 从算能官网中获取‘libsophon_0.4.1_aarch64.tar.gz’,并解压拷贝至‘arm_pcie-sdk’文件夹

    tar -xvf libsophon_0.4.1_aarch64.tar.gz
    cp -r libsophon_0.4.1_aarch64/opt/sophon/libsophon-0.4.1/include arm_pcie-sdk
    cp -r libsophon_0.4.1_aarch64/opt/sophon/libsophon-0.4.1/lib arm_pcie-sdk
    

解压后libsophon的目录为‘libsophon_0.4.1_aarch64/opt/sophon/libsophon-0.4.1’

  1. 从算能官网中获取‘sophon-mw_0.4.1_aarch64.tar.gz’,并解压拷贝至‘arm_pcie-sdk’文件夹

    tar -xvf sophon-mw_0.4.1_aarch64.tar.gz
    cp -r sophon-mw_0.4.1_aarch64/opt/sophon/sophon-ffmpeg_0.4.1/include arm_pcie-sdk
    cp -r sophon-mw_0.4.1_aarch64/opt/sophon/sophon-ffmpeg_0.4.1/lib arm_pcie-sdk
    cp -r sophon-mw_0.4.1_aarch64/opt/sophon/sophon-opencv_0.4.1/include/opencv4/opencv2 arm_pcie-sdk/include
    cp -r sophon-mw_0.4.1_aarch64/opt/sophon/sophon-opencv_0.4.1/lib arm_pcie-sdk
    

.将交叉编译好的SAIL,也即是‘build_arm_pcie’拷贝至‘arm_pcie-sdk’文件夹

cp build_arm_pcie/sophon-sail/include arm_pcie-sdk
cp build_arm_pcie/sophon-sail/lib arm_pcie-sdk

.安装gcc-aarch64-linux-gnu工具链

如果已经安装,可忽略此步骤

sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

上述步骤配置好之后,可以通过配置cmake来完成交叉编译,在您程序的CMakeLists.txt中添加如下段落:

CMakeLists.txt中需要使用‘arm_pcie-sdk’的绝对路径为‘/opt/sophon/arm_pcie-sdk’,实际应用中需要根据自己实际的位置来进行配置。

set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_ASM_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)

include_directories("/opt/sophon/arm_pcie-sdk/include")
include_directories("/opt/sophon/arm_pcie-sdk/include/sail")
# 添加交叉编译需要使用的头文件目录

link_directories("/opt/sophon/arm_pcie-sdk/lib")
# 添加交叉编译需要使用的动态库目录

add_executable(${YOUR_TARGET_NAME} ${YOUR_SOURCE_FILES})
target_link_libraries(${YOUR_TARGET_NAME} sail)
# sail为需要链接的库