Linux上交叉编译opencv

1. 简介

主要介绍linux上交叉编译opencv2.4.9,运行目标平台PX3SE(类似RK3128) linux上程序安装目录结构

bin----指应用程序文件
lib----指库文件
usr/bin 是系统自带的应用
usr/local/bin 是自己安装的应用和自己写的全局脚本(安装opencv里面的一些应用在里面
usr/lib 系统自带的lib
usr/local/lib 是自己安装的libopencv的安装lib包都在里面

//编译opencv使用工作目录(以px3se为例说明)

C:/home/dong/linux_sdk/buildroot/output/host/usr/bin/arm-rockchip-linux-gnueabihf-gcc
C++:/home/dong/linux_sdk/buildroot/output/host/usr/bin/arm-rockchip-linux-gnueabihf-g++

2.交叉编译

交叉编译依赖工具:cmake cmake-gui 交叉编译工具链(我们直接使用buildroot构建的)

1.使用cmake-gui(sudo apt-get install cmake-qt-gui)

(a)取消部分编译选项

因为是交叉编译到其它平台,所以有一些模块,可能编译不通过,需要取消一下

编译时,在cmake-gui里面取消一下WITH选项。例如-CUDA
    取消内容如下
    WITH_CUDA
    WITH_1394
    WITH_CUBLAS
    WITH_NVCUVID
    WITH_OPENCL
    WITH_OPENCLAMDBLAS
    WITH_OPENCLAMDFFT
    WITH_OPENEXR
    WITH_OPENGL
    WITH_OPENMP
    WITH_OPENNI
    WITH_QT
    WITH_TBB
    WITH_TIFF
    WITH_VTK
    WITH_XIMEA
    build里面取消的选项
    BUILD_TIFF
    BUILD_TBB

(b)设置一下部分路径

CMAKE_FIND_ROOT_PATH  设置
        /home/dong/linux_sdk/buildroot/toolchain
        目前暂时无法确定为什么(设置该选项的作用)
        CMAKE_INSTALL_PREFIX 设置安装路径
        /homo/dong/workspace/opencv-arm/lib

2.在编译opencv的时候出现recompile with -fPIC

编译过程中难免遇到一些问题

make[2]: *** [lib/libopencv_core.so] 错误 1
make[1]: *** [modules/core/CMakeFiles/opencv_core.dir/all] 错误 2
    第一先找到出错的模块,比如zlib模块。那么在路径
    3rdparty/zlib/CMakeFiles/zlib.dir/flags.make 加上-fPIC
    目前测试中发现,有好几个文件需要进行修改加上-fPIC

    终极暴力法:
    set(CMAKE_CXX_FLAGS "-fPIC")   //c++
    set(CMAKE_C_FLAGS "-fPIC")   //c

3.编译时出现了(在执行了make命令后)

../../lib/libopencv_core.so: undefined reference to `pthread_spin_init'
../../lib/libopencv_core.so: undefined reference to `pthread_spin_unlock'
../../lib/libopencv_core.so: undefined reference to `pthread_spin_lock'
../../lib/libopencv_core.so: undefined reference to `pthread_spin_destroy'
../../lib/libopencv_core.so: undefined reference to `pthread_once'
../../lib/libopencv_core.so: undefined reference to `clock_gettime'
../../lib/libopencv_core.so: undefined reference to `pthread_spin_trylock'
这个原因是因为没有找到pthread链接库,打开改目录下的CmakeCache.txt文件,

//Flags used by the linker.(大概在194行附近),不要按网上添加-lrt(会报错) CMAKE_EXE_LINKER_FLAGS:STRING=-lpthread
添加上-lpthread 补充:网上有修改为 CMAKE_EXE_LINKER_FLAGS:STRING:-lpthread -ldl -lrt(会报错)

-lpthread支持线程
        -ldl避免未定义dlopen
        -lrt避免未定义
        执行make成功后make install安装

4.安装完成文件解读

1.之前CMAKE_INSTALL_PREFIX设置路径
    编译完成可以找到share lib include文件

5.其它方法编译

也就是源码编译安装,源码编译安装分成3个部分:
配置configure、编译make、安装make install安装。
    整个过程会用到
with:指定依赖
--with-依赖包名称=依赖包目录
--with-apxs是指定apache的配置程序路径,
--with-libxml-dir指向libxml的库路径。
--with-gd指静态编译gd库。
--with-png-dir指定libpng路径。
./configure --prefix
以上表示:.  当前目录 ,总体表示:在当前目录下指定安装目录。
如果不指定prefix,则按照默认处理,即:

可执行文件:/usr/local/bin
库目录:/usr/local/lib
配置文件:/usr/local/etc
其它资源文件:/usr/local/share

如果后期需要卸载掉该程序,
1)、在原来make目录下使用make uninstall(在指定了make uninstall)
2)、无法使用make uninstall时,只能手动一个一个删除。
备注:指定了prefix的话,只要将该指定文件直接删除就ok。

6.使用cmake windows上编译出现

the compiler can assume that the address of 'annotate_img' will never NULL

solution:找到opencv-2.4.9/build/modules/contrib/CMakeFiles/opencv_contrib.dir/flags.make文件,删掉-Werror=address,然后重新
mingw32-make