交叉编译OpenCV

环境

  • 编译环境:Win7
  • 目标硬件:Xilinx Zynq UltraScale+ MPSoC(4 核A53 Armv8架构)
  • 目标操作系统:经剪裁的Ubuntun
  • opencv:3.1.0
  • make:GNU make 3.8.1
  • Cmake:3.17.3

CMake-gui

安装

Cmake下载非常慢,目前没有找到好的解决方法。

https://cmake.org/download/

https://cmake.org/files/v3.18/(个人推荐)

使用步骤

在这里插入图片描述

  1. 选择源码目录
  2. 选择编译生成路径
  3. 首次配置

在这里插入图片描述
4. 选择makefiel类型
5. 配置编译链等
6. 下一步

在这里插入图片描述
7. 标签
8. 设置交叉编译工具链
9. Finsh
10. Configue(配置菜单),如配置出错则会标为红色
11. Generate(产生Makefile)

Cmake 自动根据会根据 CMakeLists.txtcmake-gui 的配置生成 Makefile
在这里插入图片描述
打开cmd,执行 make 编译,等待编译完成即可。
在这里插入图片描述

注意事项

这里不建议采用 make -j4 / make -j8 等加速编译

主要用在 多核CPU上, make -j4表示 make最多允许4个编译命令同时执行,这样可以更有效的利用CPU资源

如果项目的 Makefile 不规范,没有正确的设置好依赖关系,并行编译的结果就是编译不能正常进行。如果依赖关系设置过于保守,则可能本身编译的可并行度就下降了,也不能取得最佳的效果。

所以并不建议大家使用。

Q&A

编译过程:

can not be used when making a shared object; recompile with -fPIC

LinkingCXXsharedlibrary../../lib/libopencv_imgcodecs.so c:/arm123/bin/../lib/gcc/aarch64-linux-gnu/6.2.1/../../../../aarch64-linux-gnu/b in/ld.exe: ../../3rdparty/lib/libIlmImf.a(ImfHeader.cpp.obj): relocation R_AARCH64_ADR_PREL_PG_HI21 against external symbol `_ZTVNSt7__cxx1119basic_ostringstrea mIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21'can not be used when making a shared object; recompile with -fPIC
解决
cmake-gui 中配置
CMAKE_C_FLAGS 设置为 -O3 -fPIC
CMAKE_CXX_FLAGS 设置为 -O3 -fPIC

arm平台交叉编译opencv出现 undefined reference to `png_init_filter_functions_neon’

解决
找到 3rdparty/libpng/CMakeLists.txt
在最上面加上
SET(ARM 1)
SET(ENABLE_NEON 1)

undefined reference to `pthread_mutexattr_destroy’

…/…/lib/libopencv_core.so: undefined reference to pthread_mutexattr_destroy' ../../lib/libopencv_imgcodecs.so: undefined reference topthread_create’
…/…/lib/libopencv_core.so: undefined reference to dlopen' ../../lib/libopencv_core.so: undefined reference topthread_mutex_trylock’
…/…/lib/libopencv_core.so: undefined reference to dlsym' ../../lib/libopencv_core.so: undefined reference topthread_mutexattr_settype’
…/…/lib/libopencv_imgcodecs.so: undefined reference to pthread_join' ../../lib/libopencv_core.so: undefined reference topthread_mutexattr_init’
collect2.exe: error: ld returned 1 exit status
解决
CMAKE_EXE_LINKER_FLAGS 加上 -pthread -lrt

…/…/lib/libopencv_core.so: undefined reference to `dlopen’

…/…/lib/libopencv_core.so: undefined reference to dlopen' ../../lib/libopencv_core.so: undefined reference todlsym’
collect2: ld returned 1 exit status

解决
CMAKE_EXE_LINKER_FLAGS = -pthread -lrt -ldl

莫名其妙卡住的问题

解决
我是关闭了以下两个选择才不会卡住的…原因未知
WITH_CUDA
WITH_WEBBP

测试

环境搭建

大恒智星 Pallas_Qt_mingw32_SDK 开发环境搭建

pro

INCLUDEPATH += $$PWD/../../../DH_Opencv310\OpenCV\include
INCLUDEPATH += $$PWD/../../../DH_Opencv310\OpenCV\include\opencv
INCLUDEPATH += $$PWD/../../../DH_Opencv310\OpenCV\include\opencv2

DEPENDPATH += $$PWD/../../../DH_Opencv310/OpenCV/lib \

LIBS += -L$$PWD/../../../DH_Opencv310/OpenCV/lib \
        -lopencv_shape -lopencv_stitching -lopencv_objdetect \
        -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui \
        -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc \
        -lopencv_flann -lopencv_core

main

#include <QCoreApplication>
#include <iostream>
#include <qDebug>
#include <opencv2/opencv.hpp>

using namespace cv;

int main(int argc, char *argv[])
{
    
    
    qDebug() << "OPenCV Version is " << CV_VERSION;
    
    QCoreApplication a(argc, argv);

    return a.exec();
}

警告

libopencv_shapeso, not found (try using -rpath or -rpath-link)

warning: ../../lib/libopencv_video.so, needed by D:/Program Files/Qt5.8/daheng_opencv_test/../../../DH_Opencv310/OpenCV/lib/libopencv_shape.so, not found (try using -rpath or -rpath-link)

原因
编译后的 opencv动态库 自带路径 [ ../../lib/libopencv_imgproc.so];
使用命令查看:readelf -d libopencv_imgproc.so
在这里插入图片描述
如果觉得麻烦,proLIBS末 加上 -rpath / -rpath-link 即可

执行

上传到开发版上执行:
在这里插入图片描述

参考鸣谢

Opencv 交叉编译

嵌入式开发之Opencv(一)交叉编译

linux编译命令——make -j8

opencv海思平台移植解决warning: …/…/lib/libopencv_imgproc.so, needed by …/lib/libopencv_imgcodecs.so, not

arm平台交叉编译opencv出现 undefined reference to `png_init_filter_functions_neon’

猜你喜欢

转载自blog.csdn.net/weixin_40774605/article/details/107019523