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

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 scope
 9177 |   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>

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



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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZPILOTE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值