本文中使用到的工具和环境是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,但是没有显示开发板处理的结果。
未完待续,坑比较多。