1. 简介
主要介绍linux上交叉编译opencv2.4.9,运行目标平台PX3SE(类似RK3128) linux上程序安装目录结构
bin----指应用程序文件
lib----指库文件
usr/bin 是系统自带的应用
usr/local/bin 是自己安装的应用和自己写的全局脚本(安装opencv里面的一些应用在里面)
usr/lib 系统自带的lib
usr/local/lib 是自己安装的lib(opencv的安装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
您还没有登录,请您登录后发表评论。