本文中使用到的工具和环境是opencv3.2.0,ubuntu16.04,arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 gcc4.8.3版本,qt5.7。遇到的坑比较多,有的还没解决掉。

1、使用命令pkg-config --cflags opencv出错

pkg-config --cflags opencv

主要是配置opencv的文件不对,可以看参考文献【1】

2、开发板资源不足

空间不够了,就是遇到在开发板中,文件的资源不足,出现write error in swap file,解决方法参考文献【2】

3、IP位置固定

这里用到的是使用IP地址和虚拟机通信,但是总是IP位置不定,或者修改不好,看参考文献【3】,但是【3】中也没有完整解决掉这个问题。可以参考文献【4】,其中第一个方案我就能解决问题了,设置静态IP,reboot重启开发板,通过ifconfig就可以看到自己的IP地址已经改成自己需要的了。

auto eth0
iface eth0 inet dhcp更改成iface eth0 inet static
        address 192.168.1.xx
        netmask 255.255.255.0
        network 192.168.0.0  [这里是非必须的]
        gateway 192.168.0.200 [这里是非必须的]

4、遇到不能执行二进制文件

这个交叉编译器在Ubuntu系统中能够实现生成a.out文件,在开发板中出现下图中的cannot execute binary file,这里请教一个大佬,还在研究中。

root@iTOP4412-ubuntu-desktop:/eric# arm-none-linux-gnueabi-gcc hello.c 
-bash: /usr/local/arm/arm-2014.05/bin/arm-none-linux-gnueabi-gcc: cannot execute binary file

一 可能没安装交叉工具链
二 安装了 交叉工具链 在/etc/profile没有设置正确
三设置好了 没使用sourse /etc/profile更新你设置的信息

解决方法:a.命令 chmod x(777) 目标文件(.o)操作,改变文件的权限进行操作的,这个没有结果。

使用arm-none-linux-gnueabi-gcc/g++等编译情况,如下表:

虚拟机下交叉编译测试文件

 

虚拟机运行结果

编译器

hello.c

bash: ./hello: cannot execute binary file: 可执行文件格式错误

arm-none-linux-gnueabi-gcc

正常运行

系统自带gcc

hello.cpp

bash: ./hellocpp: cannot execute binary file: 可执行文件格式错误

arm-none-linux-gnueabi-gcc

正常运行

系统自带g++

arm_cv_test.cpp

bash: ./test: cannot execute binary file: 可执行文件格式错误

 arm-none-linux-gnueabi-g++ $(pkg-config --cflags --libs opencv) arm_cv_test.cpp -o test

/usr/bin/ld: 当搜索用于 /opt/arm/opencv-3.2.0…*.so时跳过不兼容的 -lopencv_shape

g++ $(pkg-config --cflags --libs opencv) arm_cv_test.cpp -o test

 

 

 

 

 

 

 

 

 

 

考虑到可能是编译器的问题,所以在看到有的在编译过程中增加-static命令,如下图所示的那样,竟然是能够在虚拟机中和开发板中同时能够得到运行的结果,amazing。

arm-none-linux-gnueabi-gcc hello.c -o hello -static

arm-none-linux-gnueabi-g++ hello.cpp -o hellocpp -static

开发板测试情况:
 

开发板中交叉编译运行的结果

测试程序

开发板运行结果

编译器命令

hello.c/hello.cpp

正常运行

上图中的编译方式

arm_cv_test.cpp

-bash: ./test: No such file or directory

 

arm-none-linux-gnueabi-g++ arm_cv_test.cpp -o test 



 -lpthread -lrt -ldl `pkg-config --libs --cflags opencv`

 

 

 

 

 

查看产生的test文件,file test命令,是支持ARM 32位的文件啊,不知道问题出在了哪里了。

test: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped

5、找不到文件怎么办

很多博主使用的是opencv2.4.9版本的,这个和技术人员给的是一致我,我一直没有去尝试,主要是觉得版本比较老了,想采用比较新的版本。

按理说这样也应该没有错的,配置没有问题的,在一些文章中,文献【5】【6】中,和他使用的交叉编译器是一致的。参考文献【7】中则是更加详细地介绍怎么编译的,对我的帮助很大,但他使用的编译器在编译qt中我遇到很多解决不来的麻烦。其他的结果则基本上是一致的。文献【8】中比较有意思,使用的是open3.3版本,使用的gcc4.7,但是没有显示开发板处理的结果。

未完待续,坑比较多。