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 };
解决办法:
有两种方法:
- 修改源代码文件 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
- 如果不想修改源代码太多,可以在 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>
⭐️👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍🌔