交叉开发#
Debian Multiarch#
Debian 项目为多种计算机架构(包括 AMD64 和 ARM64)维护软件包仓库。这些对于从 AMD64 开发主机针对 ARM64 设备(如 Smart blaze)进行交叉开发非常有用。在 Debian 上,这两种架构的软件包均可从相同的仓库 URL 获取,从而可以方便地安装不同架构的软件包作为构建依赖项。
信息
在 Ubuntu 上,ARM64 仓库位于单独的 ubuntu-ports 仓库中。
借助 Multiarch 功能,您可以安装用于交叉工具链的外部架构软件包。库软件包的 -dev 变体通常是最相关的,因为它们提供了针对这些软件包进行构建所需的头文件和库。为了进行调试,您还可以安装调试符号(-dbg 或 -dbgsym)以及相应的源代码包(单独安装)。
交叉开发工具链由 crossbuild-essential-arm64 软件包提供。
原生开发#
对于应用程序开发,最方便的方法是先在目标虚拟机(或其他 ARM64 机器)上原生构建和测试您的应用程序,然后再从 AMD64 开发主机进行交叉编译。
使用 Docker 容器进行交叉构建#
上述 Multiarch 概念在 Smart blaze SDK 包含的用于交叉构建的 Docker 容器中进行了演示。该容器包括交叉开发工具链、pylon SDK 的开发文件以及 pylon Supplementary Package for blaze。该容器预配置了用于交叉构建 ARM64 可执行文件的 CMake 工具链文件。有关设置该容器的信息,请参阅 Docker Container for Development。
要构建您自己的软件,请扩展 Dockerfile 以安装所需的 <packagename>-dev:arm64 依赖项。在大多数情况下,这些可以通过对应的 find_package CMake 调用进行集成。例如,Docker 容器包含 libopencv-dev 软件包。在 blaze 示例 CMakeLists.txt 文件中,您将找到以下调用:
使用 ${OpenCV_INCLUDE_DIRS} 变量与 target_include_directories() 和 ${OpenCV_LIBS} 变量与 target_link_libraries()。某些软件包(例如 Boost)还导出了一个 CMake 目标。在这种情况下,只需链接到 target_link_libraries()中的目标即可,它还会自动配置包含路径。
如果您的依赖项无法作为 Debian 软件包获取,但提供了 CMake 支持,请使用 FetchContent 模块从源码构建它们。在这种情况下,请按照项目文档中的说明在 Docker 容器中安装所需的构建依赖项。如果该库不支持 CMake,您可以使用更通用的 ExternalProject 模块。
用于开发的 Docker 容器#
要为相机开发软件,您可以设置一个包含交叉开发工具链和所有必需软件包的 Docker 容器。
要安装 Docker 引擎,请按照 docs.docker.com 上的说明进行操作。
构建 Smart blaze 开发容器#
pylon Supplementary Package for blaze 包含一个用于设置交叉开发容器的 Dockerfile。在典型的 Linux 系统中,该文件位于 /opt/pylon/share/pylon/Samples/blaze/smartblaze/vm/container/Dockerfile。要构建容器,请转到包含 Dockerfile 的目录并在终端中运行以下命令:
这将创建一个包含交叉工具链、pylon SDK for blaze 以及适用于交叉编译的 CMake 配置的 Debian 容器。
在 Docker 容器中运行命令#
要在开发容器中运行命令,请创建以下别名:
为方便起见,您可以将此行添加到您的 ~/.bashrc 文件中。
即: dockerDo 该别名将当前工作目录挂载到临时容器中,并执行以下命令: dockerDo 在容器内部执行。挂载的目录将用作该命令的工作目录。该命令在容器内部执行时,其用户 ID 与构建容器的用户(应为当前用户)相匹配。这可以避免容器内创建的文件出现权限问题。
示例:
信息
该容器已定义了环境变量 CMAKE_TOOLCHAIN_FILE,该变量指示 CMake 使用开发容器中包含的 ARM64 交叉编译器工具链。
使用 ELBE SDK(嵌入式 Linux 构建环境)进行交叉构建#
为避免使用 Docker 容器以及针对 rootfs 和交叉构建环境的重复包数据,可以从 elbe/blazevm.xml(与 rootfs 相同的源)创建一个 Yocto 风格的 SDK。有关详细信息,请参阅 Building an SDK with ELBE。
对于 CMake 项目,请使用 ELBE SDK,如下方针对 blaze 示例项目所示。请调整 CMake 工具链文件路径以匹配您的安装。在典型的 Linux 系统中,该路径为 /opt/pylon/share/pylon/Samples/blaze/smartblaze/vm/elbe/cross-toolchain.cmake。
cd /opt/pylon/share/pylon/Samples/blaze/cpp/FirstSample/
. /opt/elbe-sdk-aarch64-linux-gnu-BlazeVM-1.2/environment-setup-elbe-aarch64-linux-gnu-BlazeVM-1.2
export CMAKE_TOOLCHAIN_FILE=/opt/pylon/share/pylon/Samples/blaze/smartblaze/vm/elbe/cross-toolchain.cmake
cmake -B build .
cmake --build build -j$(nproc)
管理相机上的虚拟机#
配置好虚拟机(VM)的互联网访问权限后,您可以使用以下命令安装软件包: apt-get 或 pip install。或者,您也可以扩展 elbe/blazevm.xml 配置文件以从头开始构建新的根文件系统。
目标虚拟机上的运行时库
使用 Docker 容器或 ELBE SDK 构建软件并将其安装到虚拟机上时,请确保所有运行时依赖项都存在。对于您在交叉构建环境中安装的每个 <packagename>-dev:arm64 软件包,请在目标根文件系统中安装相应的库软件包。对于 OpenCV,所需的软件包分为多个模块。对于 blaze 示例,您需要 libopencv-calib3d, libopencv-core, libopencv-highgui, libopencv-imgcodecs和 libopencv-imgproc.