• 在ubuntu18.04上交叉编译opencv2.4.9


    公司项目中用到了opencv,但是当时项目比较着急,因此同事直接给了编译好的opencv的库,自己并没有尝试从头去编译,项目结束后有点时间,于是自己尝试去从头交叉编译opencv,现在把过程记录一下,后面再需要对OpenCV别的版本进行交叉编译的时候可以直接看自己的笔记。

    环境

    PC:vmware + ubuntu18.04

    交叉编译工具链:arm_hisiv300_linux(HISI3536的交叉编译工具)

    opencv版本:opencv-2.4.9.zip

    交叉编译

    下载opencv2.4.9源码,然后解压,

    安装cmake-gui

        

    1 sudo apt-get install cmake-gui

    创建build文件用于编译opencv,创建install文件夹作为输出目录

    1 cd opencv-2.4.9
    2 mkdir build
    3 mkdir install

    然后执行cmake-gui,出现如下界面

    选择source code为opencv2.4.9的路径,选择build the binaries为我们刚才新创建的build文件夹。

    然后点击configure出现如下画面

    选择specify options for cross-compiling,next,然后出现如下界面。

    在operating system填写arm-hisiv300-linux,

    Compiler C选择自己的arm-hisiv300-linux-gcc的路径,

    C++编译器选择arm-hisiv300-linux-g++的安装路径,

    Target root选择自己的交叉交叉编译工具所在的文件夹,并且选择search in Target root ,then native system.

    然后点击configure,这时候会出现error inconfiguration process,project files may be invalid.

    解决方法是在search中搜索CUDA,把WITH_CUDA取消掉,搜索opencl把WITH_OPENCL去掉,再次选择就不会出现问题。

    在search中搜索install,把CMAKE_INSTALL_PREFIX修改为自己刚才创建的install文件夹,

    如果想让我们编译出来的opencv库为静态链接库的话,可以在search里面搜索shared,把BUILD_SHARED_LIBS去掉,这样编译出来的opencv库就是.a结尾的静态链接库了。

    另外,configure的过程中可能还会有下面的提示

    然后很多编译opencv的博客教程在编译opencv的时候会有一步: 从网上zlib、libjpeg、libpng、tiff、ffmjpeg的源码,然后对这几个库的源码进行交叉编译,实际上不用这样做,我们下载的opencv源码里面有这几个库的源码,我们只需要在cmake-gui上把相应的选项选上,这样编译opencv的过程中会把这个库编译出来(第三方库生成在build3rdpartylib),例如

    这样之后就能产生jpeg库了,同样的方法可以编译zlib等其他几个库,

    然后点击generate,然后就可以关闭cmake_gui了,

    然后开始编译

    1 cd build/
    2 make

    编译的过程中会报对pthread_once未定义的引用,对pthread_spin_lock未定义的引用等错误,

    解决方法:打开build文件夹下的CMakeCache.txt,定位到190行左右,把CMAKE_EXE_LINKER_FLAGS:STRING =改为CMAKE_EXE_LINKER_FLAGS:STRING = -pthread -lrt

    然后make

    然后make install

    这样就会在install文件夹下生成opencv库,在install的share-3rdparty文件夹下会生成zlib jpeg等几个库。

    测试验证

    编译完opencv之后想在项目中对自己编译完的OpenCV库进行验证,出现错误,

    刚开始觉得是自己编译的opencv存在问题,于是一遍又一遍的从头编译,问题依然存在,差点要重新安装了ubuntu14版本重新编译,直到搜索到下面的答案

    原来是因为imgproc是依赖于core的,被依赖的库要放到后面,于是修改自己的makefile,把-loencv_core放到了-lopencv_imgproc的后面,于是编译通过,程序测试运行通过.

    success!

    补充:有一次在HI3559A上要用opencv,把库编译出来加到工程里面编译的时候提示很多未定义,这时候把-lopencv_imgcodecs  -lopencv_imgproc 放到最前面就好了,就是因为这两个库依赖core库,所以要把它们放到core库前面。

    作者:cumtchw
    出处:http://www.cnblogs.com/cumtchw/
    我的博客就是我的学习笔记,学习过程中看到好的博客也会转载过来,若有侵权,与我联系,我会及时删除。

  • 相关阅读:
    Java实现 LeetCode 34 在排序数组中查找元素的第一个和最后一个位置
    Java实现 LeetCode 34 在排序数组中查找元素的第一个和最后一个位置
    MFC的消息映射机制揭秘
    vc++窗口的创建过程(MFC消息机制的经典文章)
    映射窗口句柄对象
    评侯捷的<深入浅出MFC>和李久进的<MFC深入浅出>
    主函数 main WinMain _tmain _tWinMain 的区别
    深入分析MFC文档视图结构(项目实践)
    深入解析MFC -- 句柄与对象的关系
    深入浅出Win32多线程设计之MFC的多线程-线程与消息队列(经典)
  • 原文地址:https://www.cnblogs.com/cumtchw/p/11102530.html
Copyright © 2020-2023  润新知