当前位置: 首页 > news >正文

Ubuntu20.04系统下使用交叉编译工具链(aarch、x86)交叉编译opencv4.5.0

文章目录

  • 0. 引言
  • 1. 准备交叉编译工具链
  • 2. 安装依赖工具
  • 3. 下载 OpenCV 源码
  • 4. 创建交叉编译工具链文件
  • 5. 配置 CMake 构建
  • 6. 构建 OpenCV
  • 7. 安装 OpenCV
  • 8. 验证
  • 9. 问题及解决办法

0. 引言

Ubuntu20.04系统下使用交叉编译工具链(aarch、x86)交叉编译opencv4.5.0.

1. 准备交叉编译工具链

假设已经有了交叉编译工具链,并且它支持目标平台(如 ARM 或其他架构)。通常,交叉编译工具链包含交叉编译的 gcc, g++, binutils 等工具,目标平台的头文件和库文件。

.
├── aarch64-linux-gnu
├── bin
├── lib
├── libexec
└── share

2. 安装依赖工具

在 Ubuntu 20.04 上,需要确保安装了以下工具和库:

sudo apt update
sudo apt install build-essential cmake git pkg-config libjpeg-dev libpng-dev libtiff-dev libgtk-3-dev libcanberra-gtk3-dev libopencv-dev

这些包是交叉编译 OpenCV 时可能需要的工具和依赖库。

3. 下载 OpenCV 源码

首先,下载 OpenCV 4.5.0 的源码:

cd ~
# 下载 OpenCV
git clone --branch 4.5.0 --single-branch https://github.com/opencv/opencv.git
# 下载 OpenCV_contrib
git clone --branch 4.5.0 --single-branch https://github.com/opencv/opencv_contrib.git

4. 创建交叉编译工具链文件

在交叉编译时,需要创建一个 toolchain.cmake 文件,指示 CMake 使用交叉编译工具链。假设工具链路径是 /path/to/your/toolchain/,工具链文件的内容如下:

# toolchain.cmake# 设置交叉编译目标
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_PROCESSOR arm)# 设置交叉编译工具链路径
SET(CMAKE_C_COMPILER /path/to/your/toolchain/bin/arm-linux-gnueabihf-gcc)
SET(CMAKE_CXX_COMPILER /path/to/your/toolchain/bin/arm-linux-gnueabihf-g++)
SET(CMAKE_FIND_ROOT_PATH /path/to/your/toolchain/)# 设置交叉编译的 sysroot
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

在此文件中:

CMAKE_C_COMPILER 和 CMAKE_CXX_COMPILER 要指向交叉编译工具链的 gcc 和 g++。
CMAKE_FIND_ROOT_PATH 设置为工具链的路径,通常是包含目标平台库文件和头文件的目录。

5. 配置 CMake 构建

创建一个新的构建目录,然后配置 CMake:

cd ~/opencv
mkdir build
cd build

运行 CMake 配置命令来设置 OpenCV 和 opencv_contrib 模块:

cmake .. \-DCMAKE_TOOLCHAIN_FILE=/path/to/your/toolchain.cmake \-DCMAKE_BUILD_TYPE=Release \-DCMAKE_INSTALL_PREFIX=/path/to/installation/directory \-DBUILD_SHARED_LIBS=ON \-DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \-DWITH_CUDA=OFF \-DWITH_OPENGL=ON \-DCMAKE_EXE_LINKER_FLAGS="-ldl"

CMAKE_TOOLCHAIN_FILE 指定交叉编译工具链文件路径。
CMAKE_INSTALL_PREFIX 指定安装路径(可以是目标文件系统的路径)。
OPENCV_EXTRA_MODULES_PATH 设置为 opencv_contrib 模块的路径,这样 CMake 会包含额外的模块。
WITH_CUDA 和 WITH_OPENGL 可以根据需求选择开启或关闭。

6. 构建 OpenCV

在 CMake 配置完成后,开始构建 OpenCV:

make -j$(nproc)

此命令会启动 OpenCV 的构建过程,nproc 会根据您的 CPU 核心数并行执行构建,以加速过程。

7. 安装 OpenCV

构建完成后,安装 OpenCV 到目标平台:

make install

这会将编译后的 OpenCV 安装到您指定的 CMAKE_INSTALL_PREFIX 路径下。如果目标平台是嵌入式设备,可以将编译好的库和头文件复制到设备的相应位置。

8. 验证

在目标平台上测试 OpenCV 是否安装成功。如果 OpenCV 安装正确,应该能够成功导入并使用 OpenCV 的库,甚至使用 opencv_contrib 中的扩展模块。

9. 问题及解决办法

问题1

opencv/3rdparty/ittnotify/src/ittnotify/ittnotify_static.c:269:28: error: ‘PATH_MAX’ undeclared here (not in a function)269 | static const char dll_path[PATH_MAX] = { 0 };

解决办法:
有两种方法:

  1. 修改源代码文件 ittnotify_static.c

可以在 ittnotify_static.c 文件中,手动添加对 PATH_MAX 常量的定义。具体操作如下:

打开 ittnotify_static.c 文件,通常路径为:

opencv/3rdparty/ittnotify/src/ittnotify/ittnotify_static.c

在文件顶部(或出现 PATH_MAX 使用之前),添加如下代码来定义 PATH_MAX:

#include <limits.h>  // 一般在这个头文件中定义了 PATH_MAX
#ifndef PATH_MAX
#define PATH_MAX 4096  // 可以根据需要调整最大路径长度,通常为 4096 字节
#endif
  1. 如果不想修改源代码太多,可以在 CMake 配置中临时定义 PATH_MAX。为此,你可以在 CMake 配置中添加一个宏定义:
cmake .. -D CMAKE_C_FLAGS="-DPATH_MAX=4096"

问题2

opencv/modules/ts/src/ts_gtest.cpp:9126:26: error: ‘_POSIX_PATH_MAX’ was not declared in this scope; did you mean ‘_PC_PATH_MAX’?9126 | # define GTEST_PATH_MAX_ _POSIX_PATH_MAX|                          ^~~~~~~~~~~~~~~
opencv/modules/ts/src/ts_gtest.cpp:9176:12: note: in expansion of macro ‘GTEST_PATH_MAX_’9176 |   char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };|            ^~~~~~~~~~~~~~~
opencv/modules/ts/src/ts_gtest.cpp:9177:25: error: ‘cwd’ was not declared in this scope9177 |   char* result = getcwd(cwd, sizeof(cwd));

解决办法:

_POSIX_PATH_MAX 无法找到,可以手动定义它。在 ts_gtest.cpp 文件的顶部(#include "precomp.hpp"这行代码之前)添加以下代码,替代使用 _POSIX_PATH_MAX:

#ifndef _POSIX_PATH_MAX
#define _POSIX_PATH_MAX 4096
#endif#include "precomp.hpp"
// #include <limits.h>

须知少时凌云志,曾许人间第一流。



⭐️👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍🌔

http://www.xdnf.cn/news/533179.html

相关文章:

  • DApp开发全流程解析:模式设计、功能参考与合约管理实践
  • Fabric初体验(踩坑笔记)
  • 详细介绍一下Python连接MySQL数据库的完整步骤
  • 命令2-IBM Spectrum Scale(以前称为 GPFS)-mmhealth cluster show NATIVE_RAID
  • SAP系统的委外业务是什么?委外采购(标准委外)与工序外协的区别有哪些?
  • 图像中紫边出现原因
  • 结构体对齐方式。
  • 《打造第二大脑》
  • python自学笔记3 控制结构
  • es快速上手(从MySQL角度)
  • HarmonyOS Navigation组件深度解析与应用实践
  • Baklib Headless CMS 全面介绍
  • VAPO:视觉-语言对齐预训练(对象级语义)详解
  • Amazon Q 从入门到精通 – 测试与重构
  • 什么是一次性支付?什么是网关支付?什么是认证支付?
  • 科普:极简的AI乱战江湖
  • MyBatis:动态SQL
  • 机器学习EM算法原理及推导
  • 基于大模型预测癫痫的技术方案
  • deep search框架deerflow
  • 腾讯云怎么在游戏云中助力
  • 说一下响应状态码有哪些?
  • Model 复现系列(一)OpenVLA
  • 卷积神经网络基础(九)
  • 语言幻觉测试用例及相关策略总结
  • 软件设计师“测试用例”考点分析——求三连
  • 2025-5-17Vue3快速上手
  • JavaScript:文件上传功能与断点续传
  • 并发编程(5)
  • STM32 控制 OLED 全攻略(二):实现字符和汉字的显示