交叉编译opencv并移植到hi3516

环境准备:

编译环境:Ubuntu-14.04

交叉编译工具链:arm-linux-gnueabi-4.5.1

目标机器:粤嵌GEC210开发板S5PV210(Cortex-a8)

opencv库:opencv-3.2.0(源码),解压至某一目录

opencv_contrib库:opencv_contrib-3.2.0(扩展库源码),解压至某一目录

cmake及cmake-gui编译工具:若未安装,请执行

$ sudo apt-get install cmake
$ sudo apt-get install cmake-qt-gui

其他依赖库:

$ sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg-dev libtiff4-dev libswscale-dev libjasper-dev

一、cmake-gui界面配置opencv,并生成Makefile

cmake的主要作用是生成Makefile,opencv交叉编译需要借助cmake来生成Makefile。

1、任一目录下,进入cmake-gui界面:

$ sudo cmake-gui

交叉编译opencv并移植到hi3516_第1张图片
source code源码:选择解压出来的opencv目录

build the binaries编译目录:自行创建一个目录,如我在opencv源码下创建一个build-arm

2、配置生成目标选项

点击 Configure ,配置如图:
交叉编译opencv并移植到hi3516_第2张图片
配置两项: Unix Makefiles 、 Specify options for cross-compiling

我们最终要的是linux Makefile,交叉编译cross-compling

点击 Next

3、配置编译器

配置如图:
交叉编译opencv并移植到hi3516_第3张图片
Operating System操作系统:arm-linux

编译器 C:选择交叉编译器的gcc,如我的 arm-linux-gcc

编译器 C++:选择交叉编译器的g++,如我的 arm-linux-g++

Target Root:选择交叉编译器的bin目录

完成,点击 Finish

4、指定编译的内容、路径等
交叉编译opencv并移植到hi3516_第4张图片
勾上 BUILD_JPEG 和 BUILD_JNP (此2项可选)
交叉编译opencv并移植到hi3516_第5张图片
重要一项—配置安装目录:

默认是/usr/local,这样会用交叉编译后的库替换了原有的库,且不可用。

最好自行创建一个目录,方便管理。如我将安装在 /usr/local/arm/opencv-arm
交叉编译opencv并移植到hi3516_第6张图片

重要: 如果你要编译成静态库。

opencv默认是编译成动态库,把shard取消勾选,就是编译成静态库。
交叉编译opencv并移植到hi3516_第7张图片

5、执行配置,生成Makefile

配置完成,再次点击 Configure,点 Generate,如图:
交叉编译opencv并移植到hi3516_第8张图片
configuring done , generating done ,应该已经生成Makefile了,完成则关闭界面。

二、编译、安装opencv

1、查看是否已生成Makefile

进入编译目录(即前面配置的“build the binaries编译目录”),可看到刚刚生成的Makefile文件:
$ cd /root/library/opencv/opencv-3.2.0/build-arm/
交叉编译opencv并移植到hi3516_第9张图片
2、执行编译,并静候出错:

$ make
如愿以偿,出现以下错误:

错误1: 没有链接到 pthread 库

../../lib/libopencv_core.so: undefined reference to `pthread_mutexattr_destroy'
../../lib/libopencv_core.so: undefined reference to `pthread_create'
../../lib/libopencv_core.so: undefined reference to `dlopen'
../../lib/libopencv_core.so: undefined reference to `pthread_mutex_trylock'
../../lib/libopencv_core.so: undefined reference to `clock_gettime'
../../lib/libopencv_core.so: undefined reference to `dlsym'
../../lib/libopencv_core.so: undefined reference to `pthread_mutexattr_settype'
../../lib/libopencv_core.so: undefined reference to `pthread_join'
../../lib/libopencv_core.so: undefined reference to `pthread_mutexattr_init'
collect2: ld returned 1 exit status
make[2]: *** [bin/opencv_perf_core] 错误 1
make[1]: *** [modules/core/CMakeFiles/opencv_perf_core.dir/all] 错误 2
make: *** [all] 错误 2

解决1:

修改编译目录下的 CMakeCache.txt 文件:

找到 CMAKE_EE_LINKER_FLAGS:STRING 项:

 190 //Flags used by the linker.
 191 CMAKE_EXE_LINKER_FLAGS:STRING=' '

修改成以下:

 190 //Flags used by the linker.
 191 CMAKE_EXE_LINKER_FLAGS:STRING= -pthread -lrt

修改完成,继续 make

等待出错…

错误2: 没有链接到 dl 库

[ 49%] Built target opencv_ts
Linking CXX executable ../../bin/opencv_perf_core
../../lib/libopencv_core.so: undefined reference to `dlopen'
../../lib/libopencv_core.so: undefined reference to `dlsym'
collect2: ld returned 1 exit status
make[2]: *** [bin/opencv_perf_core] 错误 1
make[1]: *** [modules/core/CMakeFiles/opencv_perf_core.dir/all] 错误 2
make: *** [all] 错误 2

解决2:

同样是 CMAKE_EE_LINKER_FLAGS:STRING ,继续添加 -ldl

 190 //Flags used by the linker.
 191 CMAKE_EXE_LINKER_FLAGS:STRING= -pthread -lrt -ldl

再make…

错误3:

用arm-2009q3(4.4.1)编译工具链编译时,还会出现以下错误(4.5.1无此报错)

/root/library/opencv/opencv-3.2.0/modules/imgproc/src/drawing.cpp:1026: error: call of overloaded 'abs(long long int&)' is ambiguous
/usr/local/arm/arm-2009q3/bin/../arm-none-linux-gnueabi/libc/usr/include/stdlib.h:720: note: candidates are: int abs(int)

解决3:

百度解决方案,将错误处的drawing.cpp文件中的 abs()函数改为 fabs()
交叉编译opencv并移植到hi3516_第10张图片
错误4:

用arm-2009q3(4.4.1)编译工具链编译时,还会出现以下错误(4.5.1无此报错)

Linking CXX executable ../../bin/opencv_perf_core
/usr/local/arm/arm-2009q3/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.1/../../../../arm-none-linux-gnueabi/bin/ld: ../../bin/opencv_perf_core: hidden symbol `__sync_fetch_and_add_4' in /usr/local/arm/arm-2009q3/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.1/libgcc.a(linux-atomic.o) is referenced by DSO
/usr/local/arm/arm-2009q3/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.1/../../../../arm-none-linux-gnueabi/bin/ld: final link failed: Nonrepresentable section on output
collect2: ld returned 1 exit status
make[2]: *** [bin/opencv_perf_core] 错误 1
make[1]: *** [modules/core/CMakeFiles/opencv_perf_core.dir/all] 错误 2
make: *** [all] 错误 

版权声明:本文为CSDN博主「Mr_zengzr」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_30155503/article/details/79983630

你可能感兴趣的:(海思芯片研究)