Build opencv libraries for android arm, x86 ubuntu

本文详细介绍了如何在Ubuntu14.04环境下成功编译OpenCV2.4.9并开启OpenCL支持,包括源码下载、配置选项调整、编译脚本修改等关键步骤,并通过实践验证了编译过程中的注意事项,特别强调了动态调用OpenCL API的方法,确保编译后的库适用于Android和x86平台。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

废话不多说。

准备工作:

1. 下载源码: http://opencv.org/

编译平台:ubuntu14.04

opencv 2.4.6.1

本人用这种办法编译了opecv 2.4.9 的没有什么问题, 问题比opencv2.4.6.1还要少, 其实他们的原理是一样的.

opencv 源码根目录----${opencv_home}

2.

修改 ${opencv_home}/platforms/scripts/cmake_android_arm.sh 文件,添加编译选项 -DBUILD_SHARED_LIBS=ON 和 -DWITH_OPENCL=ON
修改后的cmake_android_arm.sh 文件如下:

#!/bin/sh
cd `dirname $0`/..

mkdir -p build_android_arm
cd build_android_arm

cmake -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON -DCMAKE_TOOLCHAIN_FILE=../android/android.toolchain.cmake $@ ../..\
      -DBUILD_SHARED_LIBS=ON -DWITH_OPENCL=ON

3.

修改 ${opencv_home}/cmake/OpenCVDetectOpenCL.cmake

以便生成支持编译opencl 的编译选项:

OpenCVDetectOpenCL.cmake 40 行后面添加

set(OPENCL_FOUND YES)
set(OPENCL_INCLUDE_DIR your_ocl_include_dir)
#set(OPENCL_LIBRARY    you_opencl_lib_file_path)

一个是设置ocl头文件,一个设置opencl 库文件的, 上面把他注释掉了是因为本人要用的是动态显示调用的方式去调用opencl库的api, 这样就不用在编译的添加于设备相关的opencl库了。 

4.

修改 ${opencv_home}/CMakeLists.txt
OCV_OPTION(WITH_OPENCL "Include OpenCL Runtime support" ON IF (NOT IOS) )

这一步好像在opencv2.4.9 版本的源码不用设置可以。 

这个的主要目的是为了能是下一步生成支持opencl 的选项。


5.执行 ${opencv_home}/platforms/scripts/cmake_android_arm.sh

如果执行有问题, 设置NDK 路径:

终端执行:export NDKROOT=/xxxx/android-ndk-r9d

可以看到:
--   Other third-party libraries:
--     Use IPP:                     NO
--     Use Eigen:                   NO
--     Use TBB:                     NO
--     Use OpenMP:                  NO
--     Use GCD                      NO
--     Use Concurrency              NO
--     Use C=:                      NO
--     Use Cuda:                    NO
--     Use OpenCL:                  YES

这这样就能编译相关的库了。 不过如果没有设置

set(OPENCL_LIBRARY    you_opencl_lib_file_path)
这个可能会导致一些test 编译不过去,没有关系, ocl的相关库已经能编译好了。

6. 切换到 ${opencv_home}/platforms/build_android_arm 目录:

执行:make

等待编译完成吧...

7.最终Andorid动态库在${opencv_home}/platforms/build_android_arm/lib/armeabi-v7a下生成

对于Android x86 的同理Android arm 库的编译方法, 只是步骤2, 5操作脚本是 ${opencv_home}/platforms/scripts/cmake_android_x86.sh

祝你使用愉快。 有什么问题, 欢迎指出, 以便更正。









<think>好的,用户现在的问题是,在x86_64的Ubuntu虚拟机上编译针对ARM架构(VR1106)的OpenCV项目时,出现了链接错误。具体错误是/usr/lib/x86_64-linux-gnu/libopencv_stitching.so.4.5.4d文件格式不被识别。我需要帮他解决这个问题。 首先,我需要回想之前的对话。用户之前遇到了类似的问题,当时错误是因为在x86架构下链接了ARM的库或者版本不匹配。但这次用户明确说是在x86环境下编译ARM程序,所以问题可能出在交叉编译的配置上。 用户提到使用的是OpenCV 4.10.0,而错误信息中的库是4.5.4d,这说明可能存在版本冲突。用户可能没有正确配置交叉编译工具链,导致CMake错误地链接了宿主机上的x86库,而不是ARM的库。 接下来,我需要考虑交叉编译的步骤。交叉编译需要在x86主机上生成ARM的可执行文件,所以必须使用交叉编译工具链,并且所有依赖库(如OpenCV)也需要为ARM架构编译。用户可能在CMakeLists.txt中没有正确指定工具链,或者OpenCV的路径指向了x86的库而不是交叉编译后的ARM库。 可能的解决步骤包括:安装ARM交叉编译工具链,交叉编译OpenCV库,配置CMake使用正确的工具链和库路径,确保所有依赖都是ARM架构的。此外,用户可能没有正确设置PKG_CONFIG_PATH,导致CMake找到了错误的OpenCV版本。 需要注意用户是否已经为ARM交叉编译了OpenCV,如果没有,需要指导他如何交叉编译OpenCV。同时,检查CMake命令中是否指定了正确的工具链文件,避免链接到宿主机上的x86库。 用户之前提供的引用[1]提到在ARM设备上安装Ubuntu,但当前问题是在x86虚拟机上交叉编译,可能需要不同的方法。因此,需要忽略该引用,专注于交叉编译的配置。 最后,确保用户的环境变量、CMake配置和工具链设置都正确指向ARM架构的库,避免混合使用不同架构的库文件。</think>#### 一、问题根源定位 在**x86_64架构宿主机**上编译**ARM架构(VR1106)**的OpenCV项目时,出现`libopencv_stitching.so.4.5.4d: file format not recognized`错误,主要原因如下: 1. **架构冲突**:当前链接的`libopencv_stitching.so`是x86_64架构库文件,无法用于ARM目标平台[^3][^4]。 2. **交叉编译工具链未配置**:CMake未正确使用ARM交叉编译器及配套库[^1][^5]。 3. **OpenCV依赖污染**:系统默认OpenCV库(x86_64)与ARM目标库混用[^2]。 --- #### 二、完整解决方案 ##### 1. 安装ARM交叉编译工具链 根据VR1106的ARM架构(通常为ARMv7或ARMv8),安装对应工具链: ```bash # 示例:ARMv7-A架构工具链 sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf ``` ##### 2. 交叉编译OpenCV 4.10.0 **步骤1:下载源码并配置交叉编译** ```bash wget https://github.com/opencv/opencv/archive/4.10.0.zip unzip 4.10.0.zip && cd opencv-4.10.0 mkdir build-arm && cd build-arm ``` **步骤2:创建工具链文件`arm-toolchain.cmake`** ```cmake set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR arm) # 指定交叉编译器路径 set(CMAKE_C_COMPILER /usr/bin/arm-linux-gnueabihf-gcc) set(CMAKE_CXX_COMPILER /usr/bin/arm-linux-gnueabihf-g++) # 指定ARM库搜索路径(需提前部署或通过--sysroot指定) set(CMAKE_FIND_ROOT_PATH /opt/arm-libs) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) ``` **步骤3:执行CMake配置** ```bash cmake -DCMAKE_TOOLCHAIN_FILE=arm-toolchain.cmake \ -DCMAKE_INSTALL_PREFIX=/opt/opencv-4.10.0-arm \ -DBUILD_LIST=core,imgproc,stitching \ -DBUILD_SHARED_LIBS=OFF \ .. make -j$(nproc) && sudo make install ``` ##### 3. 配置项目CMakeLists.txt 在用户项目中强制指定交叉编译环境和OpenCV路径: ```cmake # 指定工具链文件 set(CMAKE_TOOLCHAIN_FILE ${CMAKE_SOURCE_DIR}/arm-toolchain.cmake) # 手动指定交叉编译后的OpenCV路径 set(OpenCV_DIR "/opt/opencv-4.10.0-arm/share/OpenCV") find_package(OpenCV REQUIRED) # 显式链接静态库 target_link_libraries(your_target PRIVATE ${OpenCV_LIBS} /opt/opencv-4.10.0-arm/lib/libopencv_stitching.a ) ``` ##### 4. 关键验证步骤 ```bash # 检查生成的可执行文件架构 file ./your_target # 应显示:ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked... # 检查链接库路径 ldd ./your_target | grep opencv # 应全部指向/opt/opencv-4.10.0-arm路径 ``` --- #### 三、避坑指南 1. **隔离编译环境**:使用`Docker`容器或`chroot`隔离x86ARM编译环境[^2] ```bash docker run --rm -v $(pwd):/src arm32v7/ubuntu:20.04 ``` 2. **静态链接优化**:通过`-DBUILD_SHARED_LIBS=OFF`减少动态库依赖问题[^5] 3. **Sysroot配置**:若目标板有预编译根文件系统,通过`--sysroot`参数指定: ```cmake set(CMAKE_SYSROOT /opt/VR1106-rootfs) ``` --- #### 四、扩展场景解决方案 若需同时支持x86ARM平台,推荐使用**CMake Presets**管理多配置: ```cmake # CMakePresets.json { "configurePresets": [ { "name": "arm", "toolchainFile": "arm-toolchain.cmake", "environment": { "OpenCV_DIR": "/opt/opencv-4.10.0-arm" } }, { "name": "x86", "environment": { "OpenCV_DIR": "/usr/local" } } ] } ``` 通过`cmake --preset=arm`快速切换配置。 --- --相关问题--: 1. 如何验证交叉编译生成的二进制文件是否兼容目标ARM架构? 2. 交叉编译时如何处理第三方库(如FFmpeg)的依赖问题? 3.CMake中如何实现条件编译(根据架构选择不同依赖库)?[^5]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值