这是我以前做的一个项目经历,虽然是个不太大的项目,但感觉做完这个项目收获不少知识,
过程中也解决可一些这样那样的问题,也走过一些弯路。
回过头来就想把一些经历的一些小挫折,完成项目的一些经验分享给大家,希望能帮到大家,无论工作也好,学习也好能提高些效率。
项目简介:开发板上芯片是arm A8架构的,开发板连接摄像头,连接一个8寸显示屏。连接上摄像头,点开应用程序,会看到一个四格窗口界面,窗口显示视频画面等
窗口用QT来画,图像识别需要调用openCV的库函数。还要用到TCP/UDP协议传输图片。
开发环境:
Intel x86主机
Ubuntu 10.04操作系统
arm开发板
源码包:
开发板自带资料 arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz
官网下载 qt-everywhere-opensource-src-4.6.2.tar.gz
官网下载 cmake-2.8.8-Linux-i386.tar.gz
官网下载 opencv-2.4.6.1.tar.gz
经验过程:
1、安装交叉编译工具
2、编译安装QT
3、编译安装openCV
4、验证程序
下面将依次介绍
1、安装交叉编译工具链
把arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz放在 ~/Tiny210/Linux 目录下
$ cd ~/Tiny210/Linux
$ tar xvzf arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz
执行命令将在当前路径出现新目录 opt/FriendlyARM/toolschain/4.5.1
执行sudo mkdir /usr/local/arm
sudo mv /home/archermind/opt/FriendlyARM/toolschain/4.5.1 /usr/local/arm/ -r
修改PATH路径:
$ vi ~/.profile
在文件最后加上一行
PATH=$PATH:/usr/local/arm/4.5.1/bin
vi /root/.profile
在文件最后加上一行
PATH=$PATH:/usr/local/arm/4.5.1/bin
(/home/archermind为当前环境的主目录,根据自己的主目录具体修改)
保存退出,然后重启电脑。
在终端执行 $ arm-linux-gcc –v
会显示交叉编译的版本信息,说明安装成功。
2、编译安装QT
在qt-everywhere-opensource-src-4.6.2.tar.gz所在目录执行命令:
$ tar xvzf qt-everywhere-opensource-src-4.6.2.tar.gz –C /home/archermind
$ cd /home/archermind
将会出现目录qt-everywhere-opensource-src-4.6.2
$ cd qt-everywhere-opensource-src-4.6.2
执行配置命令
$ sudo ./configure -prefix /usr/local/Trolltech/qt4.6.2 -no-qvfb -embedded arm -depths 4,8,16,32 -qt-mouse-linuxtp -make libs -nomake tools -xplatform qws/linux-arm-g++ -nomake examples -nomake docs -nomake demo -no-nis -no-cups -no-iconv -no-dbus -no-glib -qt-freetype -little-endian -stl -v
$ sudo make
在make过程中一般会报出各种各样的错误,且每次编译可能问题都不一样,现将我所遇到的问题及解决方案理出如下:
1
遇到problem: undefine ....
办法: 在对应的Makefile 中 LIBS后加上 -lrt
2
遇到:png.h中有结构体未定义
办法:下载较新libpng包,解压到主目录中,进入该目录。
$./configure\
-–hos=arm-linux\ –prefix=/home/archermind/Tiny210/Linux/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi –enable-shared –enable-static
$ make
$ make install
找到包中的pngconf.h png.h,复制到指定include目录中
->~/Tiny210/Linux/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/include
3
遇到:jpeghandler.cpp文件编不过时
办法:到上级目录找到jpeg.pro 里面,把jpeghandler.cpp去掉。
4
遇到:某个目录下文件怎么弄也编不过时,如果该目录内容对你不重要时。
办法:找到目录上一级配置文件中删除编译这个目录,还可以利用configure选项 例如 -nomake tools,这样tools目录不会再编译了。
5
遇到:Error: register or shift expression expected -- `orr r3,r2,lsl#16'
办法:这是个BUG,QT里面应该先判断编译器版本的,结果人家找出来放到官网了,还好他们给出了解决方案:
http://bugreports.qt.nokia.com/browse/QTBUG-6521
To fix this issue patch /src/3rdparty/freetype/include/freetype/config/ftconfig.h Line 330.
"orr %0, %2, lsl #16/n/t" /* %0 |= %2 << 16 */
+ "orr %0, %0, %2, lsl #16/n/t" /* %0 |= %2 << 16 */
他的意思是加多一个%0在%2前面,加上后编译过。
6
遇到:提示未找到命令:arm-linux-gcc
办法:由于是sudo命令,需要root用户也添加环境变量 export PATH=$PATH:/usr/local/arm/3.4.1/bin
7
遇到:出现以下错误:../3rdparty/javascriptcore/JavaScriptCore/wtf/Platform.h:298:6: #error "Not supported ARM architecture"
make[1]: *** [obj/release/pcre_compile.o] 错误 1
make[1]:正在离开目录 `/usr/local/qt/qt-everywhere-opensource-src-4.6.3-arm/src/script'
make: *** [sub-script-make_defaulrgefile
方法:add a line in your ./configure parameters, such as "-D__ARM_ARCH_5TEJ__" , or whichever architecture definition that suits the platform.
就是在./configure参数后面增加一个"-D__ARM_ARCH_5TEJ__"
make install
遇到 权限问题
办法 sudo make
sudo make install
Make完毕之后,执行:
$ sudo make install
结束后会在/usr/local/ Trolltech/qt4.6.2目录中生成QT文件。
$ sudo cp /usr/local/Trolltech/qt4.6.2/include/* ~/Tiny210/Linux/opt/FriendlyARM/toolschain/
4.5.1/ arm-none-linux-gnueabi/include/
$ sudo cp /usr/local/Trolltech/qt4.6.2/ib/* ~/Tiny210/Linux/opt/FriendlyARM/toolschain/
4.5.1/ arm-none-linux-gnueabi/lib/
(拷贝QT头文件和库文件,是为了编译opencv做准备)
3、编译安装openCV
终端进入cmake-2.8.8-Linux-i386.tar.gz所在目录,执行:
$ tar xvzf cmake-2.8.8-Linux-i386.tar.gz –C /home/archermind
执行后会出现 /home/archermind/cmake-2.8.11.2-Linux-i386目录
终端进入opencv-2.4.6.1.tar.gz所在目录,执行:
$tar xvzf opencv-2.4.6.1.tar.gz –C /home/archermind
执行后会出现/home/archermind/opencv-2.4.6.1目录
$ cd /home/archermind/opencv-2.4.6.1
$ mkdir –r build
$ /home/archermind/ cmake-2.8.11.2-Linux-i386/bin/cmake-gui
执行后会出现cmake配置图形界面。
在窗口化界面中
选择源码目录/home/archermind/opencv-2.4.6.1
选择build目录/home/archermind/opencv-2.4.6.1/build
点击Configure,保持generator为Unix Makefiles,选择Specify options for cross-compiling,点击Next
Operating System填写arm-linux
C compilers 填写 ~/Tiny210/Linux/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linuc-gcc
C++comilers填写~/Tiny210/Linux/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linuc-g++
ROOT Target 填写/usr/local/Trolltech/qt4.6.2
(如果不编QT一般添~/Tiny210/Linux/opt/FriendlyARM/toolschain/4.5.1)
点击Finish
默认安装路径为 /usr/local,点击Generate生成Makefile
在图形框主目录找到WITH_QT 打钩,WITH_TIFF 去掉钩 ,点Configure
然后再找到新增的QT_QMAKE_EXECUTABLE选项,确保后面的路径为/usr/local/Trolltech/qt4.6.2/bin/qmake
点configure,再点Generate生成MAkefile
修改~/ opencv-2.4.6.1/modules/highgui/CMakeLists.txt
找到set(highgui_srcs ,然后下一行加上一行:
src/cap_v4l.cpp //加上这个视频文件
修改~ /opencv-2.4.6.1/cmake/templates/ cvconfig.h.cmake
24行加上:#define HAVE_CAMV4L2
234行加上:#define HAVE_QT
$ cd /home/archermind/opencv-2.4.6.1/build
$ sudo make
Make过程中可能会遇到如下问题:
1 遇到:
Linking CXX executable ../../bin/opencv_createsamples
../../lib/libopencv_core.so: undefined reference to `clock_gettime'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFerrorHandler'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFrealloc'
../../lib/libopencv_core.so: undefined reference to `pthread_key_create
解决方法:
修改build/CMakeCache.txt,CMAKE_EXE_LINKER_FLAGS原来为空,加上-lpthread -lrt,重新编译,错误消除
2 遇到:
Linking CXX executable ../../bin/opencv_createsamples
../../lib/libopencv_highgui.so: undefined reference to `_TIFFerrorHandler'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFrealloc'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFmalloc'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFmemcpy'
../../lib/libopencv_highgui.so: undefined reference to `TIFFOpen'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFfree'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFwarningHandler'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFmemcmp'
../../lib/libopencv_highgui.so: undefined reference to `_TIFFmemset'
解决方法:修改build/CMakeCache.txt,WITH_TIFF:BOOL=ON,改成OFF,重新编译,错误消除
3 遇到:OpenCV-2.2.0/modules/ml/src/gbt.cpp:474: error: 'expl' was not declared in this scope
解决: 修改gbt.cpp中14行,16行:注释掉
//#if ANDROID
#define expl(x) exp(x)
//#endif
4 遇到: lib/libopencv_features2d.so: undefined reference to `cv::SIFT::SIFT(double, bool, bool, int, int, int, int
解决: 在OpenCV2.2.0/modules/features2d/src/sift.cpp下
#ifdef __arm__
#define ARM_NO_SIFT
#endif
注释掉#define ARM_NO_SIFT.错误消除,
5 遇到:/home/ubuntu-1/opencv-2.4.6.1/modules/highgui/src/window_QT.cpp: In member function 'void GuiReceiver::showImage(QString, void*)':
/home/ubuntu-1/opencv-2.4.6.1/modules/highgui/src/window_QT.cpp:953:25: error: 'class QString' has no member named 'toStdString'
解决: vi modules/highgui/src/window_QT.cpp
953 cv::imshow(name.toStdString(), im);替换为:
954 cv::imshow(qPrintable(name), im);
编译成功!
$ sudo make install
安装成功!
sudo cp /usr/local/lib/* /usr/local/arm/4.5.1/arm-none-linux-gnueabi/lib/ -r
哈哈,到这里即将大工告成了,下面我们就来编译一个程序试试,
程序中将会用到交叉编译器,qt库,openCV库等,如果编译运行成功
说明我们配置的环境没问题:
验证程序:
编写文件opencv_test.cpp 内容如下:
#include
#include
#include
int main(int argc,char **argv)
{
CvCapture* capture = NULL;
IplImage* frame = NULL;
if(!(capture = cvCaptureFromCAM(-1))) //我这里写的参数是0 代表dev/video0
{
fprintf(stderr, "Can not open camera./n");
return -1;
}
cvNamedWindow("video", 1);
while(frame = cvQueryFrame( capture ) )
{
cvShowImage("video", frame);
}
cvDestroyWindow("video");
cvReleaseCapture(&capture);
return 0;
}
在该文件所在目录,执行命令:
$ arm-linux-g++ -o opencv_test opencv_test.cpp -I /usr/local/include -L /usr/local/lib
-lopencv_core -lopencv_highgui -lpthread –lrt
生成的程序opencv_test,用命令 $ readelf -h opencv_test 看看是不是arm执行的程序。
在开发板执行opencv-qt程序时,需要把QT所有lib库和opencv所有lib库,复制到开发板/lib/下。