这两天因为要在arm板子上跑基于opencv的程序,故对opencv2.4.10在ubuntu环境下用arm-linux-gnueabihf进行了编译。中间遇到了很多问题,现在把整个经过记录下来,以供大家参考。
opencv版本: opencv2.4.10
交叉编译器: arm-linux-gnueabihf
环境变量配置: 在当前用户命令下,配置cmake和arm-linux-gnueabihf的环境变量。
用vi .bashrc打开用户环境变量脚本,在最后行输入:
export PATH=$PATH:/home/username/linaro-multilib-2014.06-gcc4.9/bin
export PATH=/home/username/cmake-2.8.4-Linux-i386/bin:$PATH
编译opencv包括四个部分:
1. 编译jpeg库
cd /home/.../jpeg-8d 这里用的是jpeg-8d版本,从官网上下载压缩包,直接解压缩在home路径下,并且进入当前目录。
./configure CC=arm-linux-gnueabihf-gcc --host=arm-linux-gnueabihf --prefix=/home/wangxiaoming/libopencv_arm/libjpeg-8d --enable-shared --enable-static
jpeg库目录下有configure文件,故可以直接用上面的命令进行编译。
说明: CC=arm-linux-gnueabihf-gcc, 指的是所用的编译器类型,gcc指的是用来编译.C文件; --host=arm-linux-gnueabihf 指的是所用的编译器名称。--prefix指的是编译
出来 的文件存放的目录。--enable-shared --enable-static, 分别指的是动态编译和静态编译。
最后执行make, make install命令。
2. 编译zlib 库
在home下解压缩库文件,参照下图修改Makefile文件。注意,在Makefile里要添加上添加编译选项:
CFLAGS+=-fPIC。否则,后期编译opencv时会出现错误:
Linking CXX shared library../../lib/libopencv_core.so
/home/wangxiaoming/linaro-multilib-2014.06-gcc4.9/bin/../lib/gcc/arm-linux-gnueabihf/4.9.1/../../../../arm-linux-gnueabihf/bin/ld:../../3rdparty/lib/libzlib.a(gzlib.c.obj):relocationR_ARM_THM_MOVW_ABS_NC against `a local symbol' can not be used when making ashared object; recompile with -fPIC
../../3rdparty/lib/libzlib.a: error addingsymbols: Bad value
collect2: error: ld returned 1 exit status
make[2]: *** [lib/libopencv_core.so] Error1
make[1]: ***[modules/core/CMakeFiles/opencv_core.dir/all] Error 2
make: *** [all] Error 2
3. 编译opencv2.4.10时,先用cmake-gui版本进行编译。
执行./cmake-gui命令:@ubuntu:~/cmake-2.8.4-Linux-i386/bin$ ./cmake-gui 会出现cmake的图形界面。
点击configure, 选择Specify options for cross-compiling选项。接下来继续配置如下,记得用“Linux”,其它的如下配置:
再下来,选择编译选项,注意去掉 WITH_TBB,WITH_GTK等选项(具体可查看其它),ARM不支持。
另外注意更改编译安装路径:CMAKE_INSTALL_PREFIX 的路径 /usr/local 为 /home/.../libopencv 自定义的路径下。
然后configure, 再Generate.
4. 安装opencv2.4.10
在交叉编译的路径下,即在libopencv目录下,执行make命令 (cmake编译生成的makefile文件在这里)。
在此时,先把编译好的第三方库zlib和jpeg的头文件和库文件复制到 opencv安装的路径下的include和lib文件下,再 执行make命令,成功编译后。在执行make install命令, 中间遇到了错误:
CMake Error at modules/core/cmake_install.cmake:48 (FILE):
file INSTALL cannot find
"/home/../libopencv_arm/libopencv/lib/libopencv_core.so.2.4.10".
Call Stack (most recent call first):
modules/cmake_install.cmake:62 (INCLUDE)
cmake_install.cmake:75 (INCLUDE)
解决这个问题,需要在libopencv文件夹下的cmake_install.cmake文件里修改CMAKE_INSTALL_PREFIX,在之前的安装路径/home/username/libopencv_arm/libopencv/修 改为/home/username/libopencv_arm/libopencv/temp.
然后在/home/username/libopencv_arm/libopencv路径下执行make install命令,在temp文件夹下生成include, lib和share文件。
可以把../libopencv/include和../libopencv/lib和../libopencv/temp/include和../libopencv/temp/lib文件合在一起。
到此,opencv2.4.10的交叉编译完成了。
环境配置:命令vim .bashrc,在文件最后一行输入:
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/home/wng/libopencv_arm/libopencv/lib/pkgconfig
exportPKG_CONFIG_PATH
5. 编译测试
假如已经有一个hello.cpp函数文件了,进入其所在目录,执行下列命令进行编译:
arm-linux-gnueabihf-g++ hello.cpp -o hello -lpthread -lrt `pkg-config --libs --cflags opencv`
其中arm-linux-gnueabihf-g++是编译用的编译器,hello.cpp是要编译的程序;hello为编译后生成的可执行二进制程序,可以任意命名。
到此,opencv交叉编译已全部完成。
知识在于分享与交流。若有问题,欢迎大家留言!