当前位置: 首页 > 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>

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



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

相关文章:

  • FreeMarker
  • 微机系统第二章-题目整理
  • 嵌入式学习--江协51单片机day8
  • 卷积神经网络基础(九)
  • Vue-样式绑定-class
  • liunx定时任务,centos定时任务
  • 前端工程的相关管理 git、branch、build
  • Git上传项目到GitHub
  • 企业销售管理痛点解析与数字化解决方案
  • CVE-2015-1422 Gecko CMS CSRF添加管理员
  • JVM的垃圾回收机制
  • c/c++的opencv均值函数
  • 盲盒APP开发——解锁盲盒经济无限可能
  • 机器学习(14)——模型调参
  • ThreadLocal 源码深度解析
  • 【线下沙龙】NineData x Apache Doris x 阿里云联合举办数据库技术Meetup,5月24日深圳见!
  • YoloV8改进策略:卷积篇|风车卷积|即插即用
  • 【无用知识】如何做到高效率
  • 今日行情明日机会——20250519
  • 【MySQL成神之路】MySQL常用语法总结
  • 广州某科技公司遭网络攻击,境外“黑手”被锁定
  • 体坛联播|利物浦三轮不胜,孙颖莎/王楚钦晋级混双八强
  • 一周观展|一批重量级考古博物馆开馆:从凌家滩看到孙吴大墓
  • 竞彩湃|英超欧冠悬念持续,纽卡斯尔诺丁汉能否拿分?
  • 北方首场高温将进入鼎盛阶段,江南华南多地需警惕降雨叠加致灾
  • 美国考虑让移民上真人秀竞逐公民权,制片人称非现实版《饥饿游戏》