嵌入式成长轨迹62【智能家居项目】【ARM 飞凌ok6410】【QT&QWT&sqlite3安装配置】
推荐阅读顺序:
基本环境搭建:
【配置】在虚拟机Ubuntu下NFS网络文件系统建立
《ok6410 Qt移植百科全书》
【配置】QT&QWT&sqlite3安装配置 这中间出现问题可查阅
【调试】ARM QT 移植环境搭建问题---补充《ok6410 Qt移植百科全书》
日常使用:
【配置】将PC端QT代码修改为ARM端可用
【配置】SD卡一键烧写
这中间出现问题可查阅:
【调试】智能家居代码移植时环境调试问题集锦
Version 2012.12.7
环境配置人员 |
郑子木 |
硬件环境 |
QT版本为4.7.1, arm-linux-gcc版本4.2.2-eabi, 飞凌OK6410开发板 飞凌提供的3.0.1内核 |
子环境A配置:编译移植tslib1.4
配置步骤1 |
安装autoconf ,automake ,libtool三个工具 |
配置步骤2 |
解压缩tslib1.4.tar.gz
tar xzvf tslib1.4.tar.gz cd tslib
|
配置步骤3 |
./autogen.sh // 用于生成configure
|
配置步骤4 |
./configure --prefix=/usr/local/tslib/ --host=arm-linux ac_cv_func_malloc_0_nonnull=yes |
配置步骤5 |
make |
配置步骤6 |
make install |
配置步骤7 |
修改/usr/local/tslib/etc目录下的ts.conf文件,将module_raw input前面的注释和空格都去掉,注意空格必须去掉,不然出错 |
//有需要可继续添加 |
以上子环境A配置完毕 |
注意事项 |
子环境B配置:编译基本QT库
配置步骤1 |
NOKIA官网上下载qt-everywhere-opensource-src-4.7.1.tar.gz 将qt-everywhere-opensource-src-4.7.1.tar.gz压缩包解压 tar xzvf qt-everywhere-opensource-src-4.7.1.tar.gz cd qt-everywhere-opensource-src-4.7.1
|
配置步骤2 |
配置QT(可以在这里对QT进行裁剪) 解压qt-everywhere-opensource-src-4.7.1.tar.gz,并拷贝出三份,分别命名成qt-4.7.1-arm、qt-4.7.1-x86、qt-4.7.1-pc。
1、配置x86版Qt 这个主要是用来搭建qvfb。Qvfb的作用是在x86上模拟arm架构(其实也可以只用pc版做模拟),并且可以用来制作字体库。但如果没有这些需求的话可以不编译。参考引用附件《使用qvfb进行测试和制作字体库》 cd qt-4.7.1-x86 ./configure -prefix /usr/local/Trolltech/qt-4.7.1-x86 -opensource -confirm-license -embedded x86 -qt-gfx-qvfb -qt-kbd-qvfb -qt-mouse-qvfb -make tools make make install 2、配置pc版Qt。主要是用来做开发和初期调试。 cd qt-4.7.1-pc ./configure -prefix /usr/local/Trolltech/qt-4.7.1-pc -opensource -confirm-license make make install
3、配置arm版Qt。主要是用来做arm板上的Qt支持。 cd qt-4.7.1-arm ./configure -opensource -confirm-license -release -shared -embedded arm -xplatform qws/linux-arm-g++ -depths 4,8,16,18,24,32 -fast -optimized-qmake -qt-sql-sqlite -qt-libjpeg -qt-zlib -qt-libpng -qt-freetype -little-endian -host-little-endian -no-qt3support -no-libtiff -no-libmng -no-opengl -no-mmx -no-sse -no-sse2 -no-3dnow -no-openssl -no-webkit -no-qvfb -no-phonon -no-nis -no-cups -no-glib -no-xcursor -no-xfixes -no-xrandr -no-xrender -no-separate-debug-info -nomake examples -nomake tools -nomake docs -qt-mouse-tslib -I /usr/local/tslib/include -L /usr/local/tslib/lib -D__ARM_ARCH_5TEJ__
【备注】: 进行编译配置; -opensource -confirm-license -release -shared -embedded arm -xplatform qws/linux-arm-g++ -depths 4,8,16,18,24,32 -fast -optimized-qmake 加入以下插件 -qt-sql-sqlite -qt-libjpeg -qt-zlib -qt-libpng -qt-freetype -little-endian -host-little-endian 去掉以下插件 -no-qt3support -no-libtiff -no-libmng -no-opengl -no-mmx -no-sse -no-sse2 -no-3dnow -no-openssl -no-webkit -no-qvfb -no-phonon -no-nis -no-cups -no-glib -no-xcursor -no-xfixes -no-xrandr -no-xrender -no-separate-debug-info -nomake examples -nomake tools -nomake docs 设置 tslib 为鼠标驱动、校正 -qt-mouse-tslib -I/usr/local/tslib/include -L/usr/local/tslib/lib 支持 arm 体系结构,6410:-D__ARM_ARCH_5TEJ__ 2440/10:-D__ARM_ARCH_4T__ -D__ARM_ARCH_4T__
|
配置步骤3 |
修改源代码 修改qt-everywhere-opensource-src-4.7.3/mkspecs/qws/linux-arm-g++/qmake.conf文件(添加lts参数,貌似是指tslib库): QMAKE_CC = arm-linux-gcc -lts QMAKE_CXX = arm-linux-g++ -lts QMAKE_LINK = arm-linux-g++ -lts QMAKE_LINK_SHLIB = arm-linux-g++ -lts 修改qt-everywhere-opensource-src-4.7.3/src/3rdparty/freetype/include/freetype/config/ftconfig.h 将"orr %0,%2, lsl #16/n/t" /* %0 |= %2 << 16 */ 修改为 "orr %0, %0, %2, lsl #16/n/t" /* %0 |= %2 << 16 */ 意思是加一个%0在%2前面。
|
配置步骤4 |
make |
配置步骤5 |
make install |
配置步骤6 |
准备中文字体,下载文泉驿字体库 将文泉驿字体库拷贝到QtEmbedded-4.7.3-arm/lib/fonts;
或者希望制作其它字体库: 参考引用附件《使用qvfb进行测试和制作字体库》 |
配置步骤 7 |
自行在ubuntu中安装Qt creator.在其中配置好Qt库的路径(否则会出现No valid Qt version set 错误):
1、/etc/bash.bashrc后追加设置环境变量 #qt export PATH=/opt/qt-4.7.1/bin:/opt/qt-4.7.1/lib:$PATH
2、打开上方菜单Tools->options,左边选择build and run,之后在里边将qmake、gcc添加 auto detected的就不用管了,要的话就添加 Qt Versions Qt 4.7.1 (qt-4.7.1) /opt/qt-4.7.1/bin/qmake 在QT creator版本中手动加入了编译好的ARM版本,此时提示没有工具链,左边显示为红色叹号 Tool Chains GCC-arm /usr/local/arm/4.3.2/bin/arm-linux-gcc-4.3.2 GCC /usr/bin/gcc-4.6 同时在工具链中加入/usr/local/arm/4.3.2/bin/arm-linux-g++编译器路径后,提示没有安装qmlviewer,左边显示为黄色叹号。
3、在主页面左边菜单栏project那里,开起来就在第一种build&run方式里边,将qt版本和工具链都选上(如果要在电脑上运行,就得用里边配搭的Qt4.8而不是用4.7.1)。如果无法选择,就跳到第二种,尝试manage选上各个版本和工具链使之激活,再回第一种就出现可以选择了(、、、不要问我为什么,我也是走投无路、、、也许关掉qt creator再重启也行)。选好之后退出,在主页面build,运气好此时就能成功了。
4、还不能执行 /code/Helloword/moc_dialog.cpp:16: error: #error "(The moc has changed too much.)" 如果本来有一些生成的配置文件,用make clean甚至make distclean删除,再试。 |
//有需要可继续添加 |
以上子环境B配置完毕 |
注意事项 |
子环境C配置:将库添加到开发板根文件系统
配置步骤1 gcc在/lib下所需库 |
飞凌在附带的文件系统中已给出。
根文件系统/lib需要的库(具体与版本有关,你可以试一个QT程序看提示缺少什么) 可从arm-linux-gcc安装目录下得到;
|
配置步骤2 拷贝tslib、QT相关库到开发板根文件系统 |
将安装的tslib目录拷贝到开发板根文件系统的/usr/local; 将安装的QT目录QtEmbedded-4.7.3-arm拷贝到开发板根文件系统的/usr/local/Trolltech;
|
配置步骤3 |
创建QT配置文件 根文件系统的/etc目录下创建一名为profile的文件,内容如下: export QTDIR=/usr/local/Trolltech/QtEmbedded-4.7.3-arm export T_ROOT=/usr/local/tslib export PATH=$QTDIR/bin:$PATH export TSLIB_CONSOLEDEVICE=none export TSLIB_FBDEVICE=/dev/fb0 export TSLIB_TSDEVICE=/dev/event1//只要是1,触摸屏tslib测试程序就能正常工作,但在做完驱动课设后发现必须是0才可以,不知道为什么 export TSLIB_PLUGINDIR=$T_ROOT/lib/ts export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf export TSLIB_CALIBFILE=/etc/pointercal export QWS_MOUSE_PROTO=tslib:/dev/event1//只要是1,自己写的HelloQt应用程序就能正常工作,如果替换内核的话,有可能会发生改变——变为event0、1、2等。 export LD_LIBRARY_PATH=$T_ROOT/lib:$QTDIR/lib 注意TSLIB_TSDEVICE、QWS_MOUSE_PROTO指定的设备与具体开发板内核相关,可能与上面不同;
【备注】 export setTSLIB_ROOT=/usr/local/tslib #tslib 库的目录 export setTSLIB_CONSOLEDEVICE=none #tslib 运行需要的控制台,就是 LCD 屏幕 ,设定为 none export setTSLIB_TSDEVICE=/dev/event0 #触摸屏设备文件 export set TSLIB_FBDEVICE=/dev/fb0 #LCD 显示器设备文件 export setTSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf # tslib 库配置文件路径 export set TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts # tslib 库插件的目录 export set TSLIB_CALIBFILE=/etc/pointercal #触摸屏校正配置文件的路径 export setQTDIR=/usr/local/Trolltech/QtEmbedded-4.5.3-arm #QT 库的路径 export setQPEDIR=/usr/local/Trolltech/QtEmbedded-4.5.3-arm #对于 QT 4 Embedded 版本同上 export set PATH=$QTDIR/bin:$PATH #加入到 PATH export setQWS_MOUSE_PROTO=tslib:/dev/event0 #触摸屏设备文件 export set QWS_DISPLAY=LinuxFb:/dev/fb0 #LCD 显示设备文件 export set QWS_SIZE=800x600 #显示区域大小,可以不加 export setLD_LIBRARY_PATH=$TSLIB_ROOT/lib:$QTDIR/lib:/usr/local/lib:$LD_LIBRARY_PATH #加入到 LD_LIBRARY_PATH
|
配置步骤4 采用nfs方式挂载根文件系统; |
详见文档《【配置】在虚拟机Ubuntu下NFS网络文件系统建立 Version 2012.11.12》 |
配置步骤5 ARM板触摸屏校准 |
超级终端中输入: /usr/local/tslib/bin/ts_calibrate
|
配置步骤6 自己编写程序,验证下 |
1、生成Makefile 在项目.pro同级文件目录下执行../qt-4.7.1/../qmake(按自己arm qt的安装路径来设置) 2、编译 qmake结束后,在Makefile相同文件目录下执行make 3、检验 通过file ./filename 来检验是否为ARM可执行文件。出现的信息中有ELF ARM字样即可,有x86则不可。 4、拷贝到ARM板NFS文件系统的某个位置下 5、执行程序 ./filename -qws -font wenquanyi &
|
//有需要可继续添加 |
以上子环境C配置完毕 |
注意事项 在ARM上执行Qt程序要加上-qws指令,如果有指定字体库还要加-font |
子环境D配置:QWT配置安装
配置步骤1 |
解压qwt压缩包,进入目录qwt-5.2.1
|
配置步骤2 |
1、ARM版 1)qmake(使用ARM版本qmake) 2)打开目录下(有的在qwtconfig文件夹里)的qwtconfig.pri配置文件,屏蔽designer的编译。有这条语句: QWT_CONFIG += QwtDesigner 加“#”注释掉。然后再编译就通过了。 另外,qwtconfig.pri文件中有以下一句: #QWT_CONFIG += QwtExamples 这就是说工程默认是不编译示例程序的,要编译的话,就去掉注释,OK,编译完后会在qwt-5.2.1/examples目录下生成bin目录,下面就都是示例程序。 3)#make 如果没有屏蔽designer的编译,这里编译将出现错误,是关于一些Designer的头文件找不到,因为qwt自定义了一些designer的插件,方便我们进行开发,所以需要一些Qt Designer的头文件,
将qwt ARM版本的默认安装目录/usr/local/qwt-5.2.1/lib/下的4个库文件分别copy到arm文件系统的/usr/share/qt4/lib目录下和/usr/lib目录下
PC版 我们要编译出一个qwt的X86版本 1、确保Qt库已经安装并配置完毕环境变量: export PATH=/usr/local/Trolltech/Qt-4.6.3/bin/:$PATH; 2、#qmake (使用x86版本的qmake工具) 在已经安转有Qt开发环境,并且已经配置完毕的情况下,这步将顺利完成,如果出现错误,就请仔细检查Qt是否正确安转。 3、执行命令: #make 这个版本不必注释designer部分,直接编译就会通过。 4、编译完成后,执行命令: #make install 5、安装完毕后,就可以在/usr/local下看到安装好的qwt目录,执行最后一步,将库文件目录导入至环境变量: #vi /etc/profile 打开后,在最后输入: export LD_LIBRARY_PATH=/usr/local/qwt-5.2.1/lib:$LD_LIBRARY_PATH 6、在/qwt-5.2.1/designer/plugins/designer目录下会有两个编译好的库文件,如下图(可能只有一个):
将这两个库文件copy到/qtsdk-2010.01/bin/designer目录下,如下图:
ok,再打开qt creator看下:
|
配置步骤3 配置需要编译的项目的.pro文件 |
在使用qwt的工程文件中加入: INCLUDEPATH += /usr/local/qwt-5.2.1/include LIBS += -L"/usr/local/qwt-5.2.1/lib/" -lqwt
|
配置步骤 |
//有需要可继续添加 |
以上子环境D配置完毕 |
注意事项 |
子环境E配置:Sqlite3配置安装
配置步骤1 安装PC端Sqlite3 |
1、解压文件tar -zxvf sqlite-amalgamation-3.7.3.tar.gz. 2、解压后生成sqlite-3.7.3目录. cd 进入sqlite-3.7.3。 3、./configure 4、make 5、make install |
配置步骤2 配置编译ARM端Sqlite3 |
ubuntu下root用户登录 1、将sqlite-3.3.6拷贝到目录 /root 下 # cd 2、解压sqlite-3.3.6 并到该目录下建立任意目录如 build #tar -zxvf sqlite-3.6.22.tar.gz #cd sqlite-3.6.22 #mkdir build 3、修改sqlite-3.3.6下的 configure # vi configure 或者 #gedit configure 注释掉下列这些代码(以下重复两次的说明被修改文件中有两个都要改的相同字段) #if test "$cross_compiling" = "yes"; then # { { echo "$as_me:$LINENO:: error: unable to find a compiler for building build tools" >&5 #echo "$as_me: error: unable to find a compiler for building build tools" >&2;} # { (exit 1); exit 1; }; } #fi #else # test "$cross_compiling" = yes && # { { echo "$as_me:$LINENO:: error: cannot check for file existence when cross compiling" >&5 #echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} # { (exit 1); exit 1; }; }
#else # test "$cross_compiling" = yes && # { { echo "$as_me:$LINENO:: error: cannot check for file existence when cross compiling" >&5 #echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} # { (exit 1); exit 1; }; } 保存退出; 4、到刚才你所创建的目录下,创建Makefile文件 # cd build #../sqlite/configure --disable-tcl --host=arm-linux(注:这里可能会出现错误,只要把configure的路径改为绝对路径就可以了) 这个时候你所创建的目录下应该有Makefile、libtool等四个文件 5、修改刚刚生成的Makefile文件 修改 BCC = arm-linux-gcc -g -O2 为 BCC = gcc -g -O2 6、由于是移植到arm上,为了在应用程序中引用sqlite3中的API接口,我们需要创建静态库,所以再次需要修改Makefile 修改内容如下: 找到 sqlite3$(TEXE): $(TOP)/src/shell.c .libs/libsqlite3.la sqlite3.h 修改为 sqlite3$(TEXE): $(TOP)/src/shell.c .libs/libsqlite3.a sqlite3.h 找到 -o $@ $(TOP)/src/shell.c .libs/libsqlite3.la \ 修改为 -o $@ $(TOP)/src/shell.c .libs/libsqlite3.a \ (注意:这次编译不会生成sqlite的可执行文件,因为只是为了得到sqlite3.a静态库,在build目录下找到隐藏目录.libs ,该目录下有sqlite3.a) 7、重复步骤6把修改的Makefile中的sqlite3.a再改为sqlite3.la 8、执行make和make install命令,如下: # make # make install 这时应该不会有错误了,可以在目录 /usr/local 下看到目录 lib bin include 9、修改sqlite3可执行文件的执行权限 #chmod 775 sqlite3 10、将lib目录下的libsqlite3.so、libsqlite3.so.0、 libsqlite3.so.0.8.6 下载到开发板的 lib目录下,将sqlite3下载到 bin 目录下; 11、测试数据库: a、新建数据库 [rootL-ant]# sqlite3 test.db SQLite version 3.6.18 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> create table film (number,name); sqlite> insert into film values (1,'aaa'); sqlite> insert into film values (2,'bbb'); sqlite> select * from film; 1|aaa 2|bbb sqlite>.quit [rootL-ant]# b、测试程序 //test_sqlite.c #include <stdlib.h> #include <stdio.h> #include <sqlite3.h> staticintcallback(void *NotUsed, int argc, char **argv, char **azColName) { inti; for(i=0; i<argc;i++) { printf("%s = %s\n", azColName[i], argv [i]); } printf("\n"); return0; } intmain(int argc, char **argv) { sqlite3 *db; char*zErrMsg = 0; intrc; if( argc!=3 ) { fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]); } rc = sqlite3_open(argv[1], &db); if( rc ) { fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); } rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg); if( rc!=SQLITE_OK ) { fprintf(stderr, "SQL error: %s\n", zErrMsg); } sqlite3_close(db); return0; } 使用如下命令编译测试程序: arm-linux-gcc test.c -L.libs -I /root/sqlite-3.3.6/build -lsqlite3 -static 解释-L指向静态库sqlite3.a所在目录,-I指向sqlite3.h 所在目录 c、在超级终端下测试 [rootL-ant]#./test_sqlite test.db "select * from film" number = 1 name = aaa number = 2 name = bbb [rootL-ant]#
|
配置步骤 |
//有需要可继续添加 |
以上子环境E配置完毕 |
注意事项 如果测试出现问题: |
最近有需要用到sqlite,去官网下了一个编译安装后打开sqlite3出现SQLite header and source version mismatch这个错误。 百度了一下,http://stackoverflow.com/questions/6696861/how-do-i-upgrade-my-sqlite3-package-on-debian-lenny 这个解决方案。但是尝试了一问题依旧。 其实sqlite默认安装到了/usr/local/lib中,但是系统旧的sqlite库在/usr/lib/i386-linux-gnu里,而这个目录被搜索的优先级目测应该高于/usr/local/lib。我把旧的libsqlite3.so.0, libsqlite3.so.0.8.6删除就能打开sqlite3了。 ——光是删掉还不行,应在将两个文件从/usr/local/lib取出覆盖之
|
//有需要可继续添加子环境
附件目录
附件一 |
QT 移植环境搭建问题---补充《ok6410 Qt移植百科全书》 |
附件二 |
ok6410 Qt移植百科全书 |
以上以外部文件方式给出
附件三 |
使用qvfb进行测试和制作字体库 |
附件3
题目:使用qvfb进行测试和制作字体库 |
正文内容: |
测试安装情况 把usr/local/Trolltech/qt-4.7.1-x86/examples/widgits/calculator文件夹复制到root/tmp文件夹下 启动QtCreator,File-->Open File or Project...,打开root/tmp/calculator/calculator.pro 这里我们分两部分,首先编译x86下的,并运行在qvfb下,再编译arm下的,最后移到开发板下运行。 x86下的编译与调试 1.在QtCreator界面左侧点击Projects图标,打开工程设置界面。 2.在Edit Project Settings for Project calculator-->Build Settings-->Edit Build Configuration;单击Add,在下拉列表中选择Using Qt Version “x86”弹出对话框单击Ok按钮,在Edit Build Configuration:下会出现蓝色的Make x86 Release active.字符,单击激活x86 Release。 3.在Run Settings-->Edit run configuration;右侧单击Show Details按钮,在打开的下拉列表中Arguments;文本框中添加参数“-qws” 4.设置完毕,点击Edit图标,回到编辑界面。 5.编译:在Build菜单下,先Clean Project “calculator”,然后Build Project “calculator”,在右下角Compile Output窗口能看到编译信息 6.运行: 启动终端,输入/usr/local/Trolltech/qt-4.7.1-x86/bin/qvfb -width 800 -height 480 &,启动qvfb 回到QtCreator,Build-->Run,运行程序,切换我们的qvfb窗口中,就可以看到calculator的运行界面了 制作适合嵌入式系统的字库文件 1、拷贝Windows/Fonts/simhei.ttf到/usr/local/Trolltech/qt-4.7.1-x86/lib/fonts中 2、在一个终端中运行 /usr/local/Trolltech/qt-4.7.1-x86/bin/qvfb -width 800 -height 480 &,启动qvfp 3、cd usr/local/Trolltech/qt-4.7.1/bin,在另外一个终端中运行 ./makeqpf -qws,就可以看见MakeQPF界面 4、在Famiy中选择SimHei(刚刚拷贝过来的),Pixel Size中选择要生成的字体的大小20等;在OutPut Options中选择生成文件的目录,待会去那找生成出的文件 5、点击Generate Pre-Rendered Font...,待会就会显示生成成功,会生成出一个simhei_20_50.qpf2文件 6、移除之前拷贝过来的simhei.ttf,要不然看不到效果(我现在也不知道为什么) 7、关掉MakeQPF,重新运行./makeqpf -qws -font simhei,这次显示的界面就和上次不一样了,字体大小明显发生了变化 8、你也可以试试其他的文件cd /usr/local/Trolltech/qt-4.7.1-x86/examples/widgets/calendarwidget,运行./calendarwidget -qws -font simhei 和运行 ./calendarwidget -qws的默认字体,比较一下看看 9、Enjoy it! You have Done!
|
附件2
题目: |
来源: |
正文内容: |