4. 使用libsophon开发

4.1. PCIE MODE

在安装完libsophon后,推荐您使用cmake来将libsophon中的库链接到自己的程序中,可以在您程序的CMakeLists.txt中添加如下段落:

find_package(libsophon REQUIRED)
include_directories(${LIBSOPHON_INCLUDE_DIRS})

add_executable(${YOUR_TARGET_NAME} ${YOUR_SOURCE_FILES})

target_link_libraries(${YOUR_TARGET_NAME} ${the_libbmlib.so})
上面${the_libbmlib.so}即表示要链接libbmlib.so这个库,其它库同理。

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

#include <bmlib_runtime.h>
#include <stdio.h>

int main(int argc, char const *argv[])
{
    bm_status_t ret;
    unsigned int card_num = 0;

    ret = bm_get_card_num(&card_num);
    printf("card number: %d/%dn", ret, card_num);

    return 0;
}

4.2. SOC MODE

4.2.1. SOC 板卡上编译程序

如果您希望在SOC模式的板子上运行的Linux环境下进行开发,则需要安装sophon-soc-libsophon-dev_0.4.8_arm64.deb工具包,使用以下命令安装。

sudo dpkg -i sophon-soc-libsophon-dev_0.4.8_arm64.deb

安装完成后,您可以参考PCIE MODE的开发方法,使用cmake将libsophon中的库链接到自己的程序中。

4.2.2. x86 交叉编译程序

如果您希望使用SOPHON SDK搭建交叉编译环境,您需要用到的是gcc-aarch64-linux-gnu工具链以及sophon-img relesae包里的libsophon_soc_0.4.8_aarch64.tar.gz。首先使用如下命令安装gcc-aarch64-linux-gnu工具链。

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

其次解压sophon-img relesae包里的libsophon_soc_0.4.8_aarch64.tar.gz。

1. mkdir -p soc-sdk
2. tar -zxf libsophon_soc_0.4.8_aarch64.tar.gz
3. cp -rf libsophon_soc_0.4.8_aarch64/opt/sophon/libsophon-0.4.8/lib  soc-sdk
4. cp -rf libsophon_soc_0.4.8_aarch64/opt/sophon/libsophon-0.4.8/include  soc-sdk

libsophon包含了bmrt,bmlib和bmcv的库。 opencv 和ffmpeg 相关的库在sophon-mw-soc_0.4.8_aarch64.tar.gz中, 其目录结构与libsophon类似 ,只需要拷贝lib和include下所有内容到soc-sdk即可。 如果需要使用第三方库,可以使用qemu在x86上构建虚拟环境安装,再将头文件和库文件拷贝到soc-sdk目录中,命令如下:

构建qemu虚拟环境

sudo apt-get install qemu-user-static
mkdir rootfs
cd rootfs

构建Ubuntu 20.04的rootfs

sudo qemu-debootstrap --arch=arm64 focal .
sudo chroot . qemu-aarch64-static /bin/bash

进入qemu后,安装软件,以gflag为例

apt install software-properties-common
add-apt-repository universe
apt-get update
apt-get install libgflags-dev

通常情况下安装的so会在/usr/lib/aarch64-linux-gnu/libgflag* 下,只需要拷贝到soc-sdk/lib里即可。

下面以如下代码为例,介绍在您的代码中如何使用SOPHON SDK制作的soc-sdk交叉编译,以调用libbmlib中的函数:

#include <bmlib_runtime.h>
#include <stdio.h>

int main(int argc, char const *argv[])
{
    bm_status_t ret;
    unsigned int card_num = 0;

    ret = bm_get_card_num(&card_num);
    printf("card number: %d/%dn", ret, card_num);

    return 0;
}

首先按照如下步骤创建新的工作目录

mkdir -p workspace && pushd workspace
touch CMakeLists.txt
touch get_dev_count.cpp

将上面的c++代码导入到get_dev_count.cpp中,在CMakeLists.txt中添加如下段落:

cmake_minimum_required(VERSION 2.8)

set(TARGET_NAME "test_bmlib")

project(${TARGET_NAME} C CXX)

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

# 该demo链接了bmlib库,所以打开了BM_LIBS
set(BM_LIBS bmlib bmrt)
# 需要链接jpu相关的库可以打开JPU_LIBS
# set(JPU_LIBS bmjpuapi bmjpulite)
# 需要链接opencv相关的库可以打开OPENCV_LIBS
# set(OPENCV_LIBS opencv_imgproc opencv_core opencv_highgui opencv_imgcodecs
        opencv_videoio)
# 引入外部库,可以参看下面导入gflags的方法,打开EXTRA_LIBS
# set(EXTRA_LIBS gflags)

include_directories("${SDK}/include/")

link_directories("${SDK}/lib/")

set(src get_dev_count.cpp)
get_filename_component(target ${src} NAME_WE)
add_executable(${target} ${src})
target_link_libraries(${target} ${BM_LIBS} pthread dl)
# 未使用OPENCV和FFMPEG等库,所以不需要加下面的链接路径
# target_link_libraries(${target} ${BM_LIBS} ${OPENCV_LIBS} ${FFMPEG_LIBS}
                            ${JPU_LIBS} ${EXTRA_LIBS} pthread dl)

接着使用cmake来构建程序。

mkdir -p build && pushd build
cmake -DSDK=/path_to_sdk/soc-sdk ..
make

就可以在x86机器上编译出soc模式上运行的aarch64架构的程序。

上面例子只链接了bmlib的库,其它库如opencv,ffmpeg,其它lib同理。