MultiArch 与 Ubuntu/Debian 的交叉编译

发布时间:2024年01月18日

aarch64 的交叉编译

以下是在主机 (x86-64) 上编译目标 (aarch64)。

步骤 1。将目标的外部库安装到主机中

此步骤在主机上。

将目标 (arm64) 的 libfreetype-dev、libharfbuzz-dev 和 FFmpeg 软件包安装到主机 (x86-64) 中。

sudo apt 安装 -y \
libavcodec-dev:arm64 \
libavformat-dev:arm64 \
libavutil-dev:arm64 \
libswscale-dev:arm64 \
libfreetype-dev:arm64 \
libharfbuzz-dev:arm64

如果要启用 Python 3 包装器,也请安装这些包。

sudo apt 安装 -y \
libpython3-dev:arm64

如果成功,pkg-config 可以显示有关这些包的信息。

对于 Freetype2 和 Harfbuzz:

PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig \
PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu \
PKG_CONFIG_SYSROOT_DIR=/ \
pkg-config freetype2 harfbuzz --cflags --libs
-I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/harfbuzz -I/usr/include/glib-2.0 -I/usr/lib/aarch64-linux-gnu/glib-2.0/include -L/usr/lib/aarch64-linux-gnu -lfreetype -lharfbuzz

对于 FFmpeg:

PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig \
PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu \
PKG_CONFIG_SYSROOT_DIR=/ \
pkg-config libavcodec libavformat libavutil libswscale --cflags --libs
-I/usr/include/aarch64-linux-gnu -L/usr/lib/aarch64-linux-gnu -lavcodec -lavformat -lavutil -lswscale

第2步。配置 OpenCV 设置

此步骤在主机上。

执行以对 aarch64 进行交叉编译配置。cmake

注意

-DCMAKE_TOOLCHAIN_FILE应该是绝对/实际文件路径,而不是相对路径。

PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig \
PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu \
PKG_CONFIG_SYSROOT_DIR=/ \
cmake -S opencv \
-B 构建4-full_arm64 \
-DCMAKE_TOOLCHAIN_FILE=/home/kmtr/work/opencv/platforms/linux/aarch64-gnu.toolchain.cmake \
-DOPENCV_EXTRA_MODULES_PATH=opencv_contrib/模块 \
-GNinja

如果要启用 Python 3 包装器,则需要额外的选项。

PYTHON3_REALPATH='realpath /usr/bin/python3'
PYTHON3_BASENAME='基本名称 ${PYTHON3_REALPATH}'
PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig \
PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu \
PKG_CONFIG_SYSROOT_DIR=/ \
cmake -S opencv \
-B 构建4-full_arm64 \
-DCMAKE_TOOLCHAIN_FILE=/home/kmtr/work/opencv/platforms/linux/aarch64-gnu.toolchain.cmake \
-DOPENCV_EXTRA_MODULES_PATH=opencv_contrib/模块 \
-DPYTHON3_NUMPY_INCLUDE_DIRS=“/usr/local/lib/${PYTHON3_BASENAME}/dist-packages/numpy/core/include/” \
-DPYTHON3_INCLUDE_PATH=“/usr/include/${PYTHON3_BASENAME};/usr/include/” \
-DPYTHON3_LIBRARIES='查找 /usr/lib/aarch64-linux-gnu/ -name libpython*.so' \
-DPYTHON3_EXECUTABLE=“/usr/bin/${PYTHON3_BASENAME}” \
-DPYTHON3_CVPY_SUFFIX=“.so” \
-GNinja

注意

最后,“python3.XX“字符串是必需的。所以这个脚本生成了它。

  • 获取从“/usr/bin/python3”到“/usr/bin/python3.xx”的真实路径。
  • 从“/usr/bin/python3.xx”到“pyhton3.xx”获取基本名称。

以下是 cmake 输出。

  • Host是。Linux x86_64
  • Target是。Linux aarch64
  • FFmpeg 可用。
-- OpenCV 4.8.0-dev ===================================== 的常规配置
-- 版本控制: 408730b
--
-- 额外模块:
-- 位置(额外):/home/kmtr/work/opencv_contrib/modules
-- 版本控制(额外):faa5468
--
--平台:
-- 时间戳:2023-12-01T22:02:14Z
-- 主机:Linux 6.5.0-13-generic x86_64
-- 目标:Linux 1 aarch64
-- CMake:3.27.4
-- CMake 生成器:忍者
-- CMake 构建工具:/usr/bin/ninja
-- 配置:发布
--
-- CPU/硬件功能:
-- 基准:霓虹灯FP16
-- 必填项:霓虹灯
-- 禁用:VFPV3
-- 调度代码生成:NEON_DOTPROD NEON_FP16 NEON_BF16
-- 请求: NEON_FP16 NEON_BF16 NEON_DOTPROD
-- NEON_DOTPROD (1 个文件): + NEON_DOTPROD
-- NEON_FP16 (2 个文件): + NEON_FP16
-- NEON_BF16 (0 个文件): + NEON_BF16
--
-- C/C++:
-- 构建为动态库?: 是
-- C++ 标准:11
-- C++编译器:/usr/bin/aarch64-linux-gnu-g++(版本13.2.0)
:
:
--
-- 视频 I/O:
-- DC1394:否
-- FFMPEG:是的
-- avcodec:是 (60.3.100)
-- avformat:是 (60.3.100)
-- avutil:是 (58.2.100)
-- swscale:是 (7.1.100)
-- avresample:否
-- GStreamer:否
-- v4l/v4l2:是 (linux/videodev2.h)
--

如果成功启用 Python 3 包装器,则部分将显示更多内容。Python 3:

--
-- Python 3:
-- 解释器:/usr/bin/python3.11 (ver 3.11.6)
-- 库:/usr/lib/aarch64-linux-gnu/libpython3.11.so
-- numpy: /usr/local/lib/python3.11/dist-packages/numpy/core/include/ (ver undefined - 由于交叉编译而无法探测)
-- 安装路径:lib/python3.11/dist-packages/cv2/python-3.11
--
-- Python(用于构建):/usr/bin/python3.11
--

第 3 步。构建和存档 OpenCV 库和标头

在主机中执行此步骤。

构建和安装。(这意味着仅将工件复制到文件夹。installinstall

cmake --build build4-full_arm64
sudo cmake --install build4-full_arm64

使用 tar 命令将工件(构建的库和头文件)存档到。opencv_arm64.tgz

tar czvf opencv_arm64.tgz -C build4-full_arm64/install 。

并发送到目标。opencv_arm64.tgz

第 4 步。在目标上安装依赖库

此步骤在目标系统上执行。

在目标位置安装 OpenCV/OpenCV contrib 库的依赖运行时库。

sudo apt 安装 -y \
libavcodec60 \
libavformat60 \
libavutil58 \
libswscale7 \
libfreetype6 \
libharfbuzz0b
sudo ldconfig

如果要启用 Python 3 包装器,也请安装这些包。

sudo apt 安装 -y \
python3-最小 \
python3-numpy

警告

如果运行时库和/或程序的版本递增,apt 软件包名称可能会更改(例如 用于 Ubuntu 23.04,但用于 Ubuntu 23.10)。用命令或?Ubuntu – Ubuntu Packages Search?寻找它。libswscale6libswscale7apt search

警告

主机和目标之间的外部库版本应相同。请尽可能同时更新到最新版本库。

即使主机和目标之间的操作系统版本相同,由于对库的额外更新,版本也可能有所不同。这将导致意想不到的问题。

例如)

  • 在主机上,OpenCV 已使用外部 libA (v1.0) 作为目标构建。
  • libA (v1.1) 可能会更新。
  • 在 Target 上,安装了 libA (v1.1) 以使用 OpenCV。
  • 在这种情况下,libA 的版本是编译和运行之间的区别。

警告

如果您忘记/不匹配安装一些必要的库,OpenCV 将无法正常工作。

ldd命令可以检测依赖关系。如果有任何“未找到”,请安装必要的库。

ldd /usr/local/lib/libopencv_freetype.so

(不好)需要,但尚未安装。freetype modulelibharfbuzz.so.0

linux-vdso.so.1 (0xABCDEFG01234567)
libopencv_imgproc.so.408 => /usr/local/lib/libopencv_imgproc.so.408 (0xABCDEF001234567)
libfreetype.so.6 => /lib/aarch64-linux-gnu/libfreetype.so.6 (0xABCDEF001234567)
libharfbuzz.so.0 => 未找到
libopencv_core.so.408 => /usr/local/lib/libopencv_core.so.408 (0xABCDEF001234567)
:

(好)安装所需的所有库。freetype modules

linux-vdso.so.1 (0xABCDEFG01234567)
libopencv_imgproc.so.408 => /usr/local/lib/libopencv_imgproc.so.408 (0xABCDEF001234567)
libfreetype.so.6 => /lib/aarch64-linux-gnu/libfreetype.so.6 (0xABCDEF001234567)
libharfbuzz.so.0 => /lib/aarch64-linux-gnu/libharfbuzz.so.0 (0xABCDEF001234567)
libopencv_core.so.408 => /usr/local/lib/libopencv_core.so.408 (0xABCDEF001234567)
:

第 5 步。将 OpenCV 库安装到目标

这一步是有针对性的。

从主机接收(在步骤 3 中生成),并提取到 .opencv_arm64.tgz/usr/local

sudo tar zxvf opencv_arm64.tgz -C /usr/local
sudo ldconfig

您可以使用与自编译相同的 OpenCV 库。以下是 OpenCV 示例代码。在目标上编译并运行它。

生成文件

a.out : main.cpp
g++ main.cpp -o a.out \
-I/usr/local/include/opencv4 \
-lopencv_core

main.cpp

#include < iostream>
#include < opencv2/core.hpp>
int main(void)
{
std::cout << cv::getBuildInformation() << std::endl;
返回 0;
}

执行并运行它。make

制作 a.out
./a.out

如果要启用 Python 3 包装器,请执行以下命令进行确认。

python3 -c “导入 cv2;打印(cv2.getBuildInformation())”

armv7 的交叉编译

以下是在主机 (x86-64) 上编译目标 (armhf)。

  • 要解决依赖关系,是必需的。linux-libc-dev:armhf
  • 要用霓虹灯进行优化,是必需的。-DENABLE_NEON=ON
sudo apt 安装 -y \
linux-libc-dev:armhf \
libavcodec-dev:armhf \
libavformat-dev:armhf \
libavutil-dev:armhf \
libswscale-dev:armhf \
libfreetype-dev:armhf \
libharfbuzz-dev:armhf
PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabihf/pkgconfig:/usr/share/pkgconfig \
PKG_CONFIG_LIBDIR=/usr/lib/arm-linux-gnueabihf \
PKG_CONFIG_SYSROOT_DIR=/ \
cmake -S opencv \
-B 构建4-full_armhf \
-DENABLE_NEON=开 \
-DCMAKE_TOOLCHAIN_FILE=/home/kmtr/work/opencv/platforms/linux/arm-gnueabi.toolchain.cmake \
-DOPENCV_EXTRA_MODULES_PATH=opencv_contrib/模块 \
-GNinja
cmake --build build4-full_armhf
sudo cmake --install build4-full_armhf
tar czvf opencv_armhf.tgz -C build4-full_armhf/install 。

以下是 cmake 输出。

  • Host是。Linux x86_64
  • Target是。Linux arm
  • FFmpeg 可用。
-- OpenCV 4.8.0-dev ===================================== 的常规配置
-- 版本控制: 408730b
--
-- 额外模块:
-- 位置(额外):/home/kmtr/work/opencv_contrib/modules
-- 版本控制(额外):faa5468
--
--平台:
-- 时间戳:2023-12-02T03:39:58Z
-- 主机:Linux 6.5.0-13-generic x86_64
-- 目标:Linux 1 臂
-- CMake:3.27.4
-- CMake 生成器:忍者
-- CMake 构建工具:/usr/bin/ninja
-- 配置:发布
--
-- CPU/硬件功能:
-- 基线:霓虹灯
-- 请求:检测
-- 必填项:霓虹灯
-- 禁用:VFPV3
--
-- C/C++:
-- 构建为动态库?: 是
-- C++ 标准:11
-- C++编译器:/usr/bin/arm-linux-gnueabihf-g++(版本13.2.0)
:
:
--
-- 视频 I/O:
-- DC1394:否
-- FFMPEG:是的
-- avcodec:是 (60.3.100)
-- avformat:是 (60.3.100)
-- avutil:是 (58.2.100)
-- swscale:是 (7.1.100)
-- avresample:否
-- GStreamer:否
-- v4l/v4l2:是 (linux/videodev2.h)
--
文章来源:https://blog.csdn.net/2301_81888214/article/details/135643397
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。