以下是在主机 (x86-64) 上编译目标 (aarch64)。
此步骤在主机上。
将目标 (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
此步骤在主机上。
执行以对 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“字符串是必需的。所以这个脚本生成了它。
以下是 cmake 输出。
Host
是。Linux x86_64
Target
是。Linux aarch64
如果成功启用 Python 3 包装器,则部分将显示更多内容。Python 3:
在主机中执行此步骤。
构建和安装。(这意味着仅将工件复制到文件夹。install
install
使用 tar 命令将工件(构建的库和头文件)存档到。opencv_arm64.tgz
并发送到目标。opencv_arm64.tgz
此步骤在目标系统上执行。
在目标位置安装 OpenCV/OpenCV contrib 库的依赖运行时库。
sudo apt 安装 -y \libavcodec60 \libavformat60 \libavutil58 \libswscale7 \libfreetype6 \libharfbuzz0bsudo ldconfig
如果要启用 Python 3 包装器,也请安装这些包。
sudo apt 安装 -y \python3-最小 \python3-numpy
警告
如果运行时库和/或程序的版本递增,apt 软件包名称可能会更改(例如 用于 Ubuntu 23.04,但用于 Ubuntu 23.10)。用命令或?Ubuntu – Ubuntu Packages Search?寻找它。libswscale6
libswscale7
apt search
警告
主机和目标之间的外部库版本应相同。请尽可能同时更新到最新版本库。
即使主机和目标之间的操作系统版本相同,由于对库的额外更新,版本也可能有所不同。这将导致意想不到的问题。
例如)
警告
如果您忘记/不匹配安装一些必要的库,OpenCV 将无法正常工作。
ldd
命令可以检测依赖关系。如果有任何“未找到”,请安装必要的库。
(不好)需要,但尚未安装。freetype module
libharfbuzz.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):
这一步是有针对性的。
从主机接收(在步骤 3 中生成),并提取到 .opencv_arm64.tgz
/usr/local
您可以使用与自编译相同的 OpenCV 库。以下是 OpenCV 示例代码。在目标上编译并运行它。
生成文件
a.out : main.cppg++ main.cpp -o a.out \-I/usr/local/include/opencv4 \-lopencv_coremain.cpp
#include < iostream>#include < opencv2/core.hpp>int main(void){std::cout << cv::getBuildInformation() << std::endl;返回 0;}
执行并运行它。make
如果要启用 Python 3 包装器,请执行以下命令进行确认。
以下是在主机 (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:armhfPKG_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/模块 \-GNinjacmake --build build4-full_armhfsudo cmake --install build4-full_armhftar 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)--