友善之臂mini2440说明手册上的Linux相关教程都是基于Fedora的,我用VMware安装的Fedora9一直使用不习惯,网络功能不稳定、中英文界面字体大小有问题、与主机数据共享麻烦、VMtool总是装不上去。最近学习Qt,索性直接把工作平台换到我的Ubuntu12上。
一. 交叉编译QtE-4.6.3
1.安装交叉编译工具链arm-linux-gcc
直接使用友善之臂做好编译器即可。拷贝arm-linux-gcc-4.4.3.tar.gz到Ubuntu中,依照mini2440说明手册:
1)解压缩文件
tar zxvf arm-linux-gcc-4.4.3.tgz –C /
**注:**C后面有个空格,并且C是大写的,它是英文单词“Change”的第一个字母,在此是改变目录的意思。执行该命令,将把 arm-linux-gcc 安装到/usr/loca/arm/4.4.3 目录。
2)添加环境变量
确保当前是root用户,编辑/root/.bashrc 文件,在最后一行添加:
export PATH=$PATH: /opt/FriendlyARM/toolschain/4.4.3/bin
2.交叉编译QtE-4.6.3
拷贝arm-qte-4.6.3-20100802.tar.gz到Ubuntu中,解压,进入arm-qte-4.6.3目录,mini2440已经为QtE-4.6.3 的编译制作了现成的脚本,因此直接运行 ./build-all
问题解决:编译期间遇到了2个问题:
① The tslib functionality test failed! You might need to modify the include and library search paths by editing QMAKE_INCDIR and QMAKE_LIBDIR in /home/Raymond/qt-embedded-arm-tslib/mkspecs/qws/linux-arm-g++. 参考 qt4.6.3移植到mini2440的过程知,原因是arm-linux-gcc的路径没有添加到系统变量中,仔细回想才发现,虽然第一步已经将arm-linux-gcc加入root用户的.bashrc文件中,但此环境变量只有在重新启动shell终端才会生效,而我的所有操作均未打开新的终端,因此环境变量实际上并未生效。因此解决方法重新打开一个终端,再进行编译;或者更方便的方法是直接在当前终端强制刷新,输入命令:source /root/.bashrc 即可。
② 缺少zlib库问题:fatal error: zlib.h: No such file or directory。参考The tslib functionality test failed! 知这个错误是因为zlib包没有安装,因此将其安装即可,注意安装命令是:sudo apt-get install zlib1g-dev,而非sudo apt-get install zlib
二. Ubuntu主机上安装sqlite3数据库
直接在sqlite3官方下载页面下载sqlite3最新版本源码包sqlite-autoconf-3080900.tar.gz。解压缩后直接三步:
./configure
make
make install
即可直接安装完成
测试数据库,在终端中直接输入sqlite3,出现错误:SQLite header and source version mismatch。参考SQLite header and source version mismatch解决一文,这个问题是因为ubuntu里面原来自带了一个老版的sqlite运行库,位于/usr/lib/i386-linux-gnu目录,分别是libsqlite3.so.0.8.6和一个符号链接到它的libsqlite3.so.0,由于上面进行的autoconf包的sqlite3并不是静态编译,sqlite3就被默认安装到了/usr/local/bin里面去了。
解决方案:
以防万一,先备份旧文件:
mv /usr/lib/i386-linux-gnu/libsqlite3.so.0.8.6 /usr/lib/i386-linux-gnu/libsqlite3.so.0.8.6_bak
mv /usr/lib/i386-linux-gnu/libsqlite3.so.0 /usr/lib/i386-linux-gnu/libsqlite3.so.0_bak
然后复制刚编译好的新文件:
cd /usr/local/lib
cp libsqlite3.so.0.8.6 /usr/lib/i386-linux-gnu
cp libsqlite3.so.0 /usr/lib/i386-linux-gnu
问题解决。
三. 编译QtEmbedded-4.6.3-arm中的sql例程
主机中进入 /usr/local/Trolltech/QtEmbedded-4.6.3-arm/examples/sql文件夹,随便打开一个例程,如cachedtable,打开cachedtable.pro文件,在弹出的Qt工程配置中选择Qt4.8.1(System)(Debug)(注:我的Ubuntu下预先安装了Qt4.8,所以为了省事就没有在主机上另外安装Qt4.6)和Qt4.6.3(QtEmbedded-4.6.3-arm)(Release),构建模式均选择shadow build。进入Qt Creator后,先切换至Qt4.8.1点击build按钮即可。
问题解决:期间遇到了以下几个问题:
① error: private/qpixmapdata_p.h: No such file or directory。参考arthurwidgets.cpp:54:35: error: private/qpixmapdata_p.h: No such file or directory 的解决一文,知道Qt库的private目录下并没有qpixmapdata_p.h文件,因此直接从编译Qt的源码包中寻找 arm-qte-4.6.3/qt-everywhere-opensource-src-4.6.3/src/gui/image/qpixmapdata_p.h,将其拷贝至当前Qt工程目录下,然后在cpp代码中,将
#include <private/qpixmapdata_p.h>
修改为:
#include "qpixmapdata_p.h"
即可。
② 将cachedtable编译后运行,在Application Output中提示:
QSqlDatabase: QSQLITE driver not loaded
QSqlDatabase: available drivers:
意思应该是Qt的sqlite3驱动QSQLITE未载入成功,并且可用驱动列表为空。
进入目录QtEmbedded-4.6.3-arm/plugins/sqldrivers 目录下,发现sqlite驱动(文件名:libqsqlite.so)是存在的,因此想到可能是Qt Creator的默认路径中未能找到此文件导致,经多次尝试,发现qt移植过程中出现QSQLITE driver not loaded 的解决办法一文中的方法是切实可行的,为此,直接在/etc/profile中、或/root/.bashrc中,export QT_PLUGIN_PATH=/usr/lib/i386-linux-gnu/qt4/plugins ,或者直接进入Qt Creator的Projects配置选项卡中的 Build Environment中,点击Add按钮,增加QT_PLUGIN_PATH,并输入路径 /usr/lib/i386-linux-gnu/qt4/plugins 即可。
【注】另外,经测试发现,之所以出现这个问题,是因为在最初工程配置中,将桌面版的Qt4.8.1配置成了Embedded Linux,而不是Desktop版本,因此,只要重新将Qt4.8.1配置成Desktop版本即可避免此问题。
③ 【未解决问题】以上直接使用Qt的sqlite驱动操作sqlite3数据库,并未使用到之前移植的sqlite3中的任何文件。并且,即使将移植的sqlite3中的动态库libsqlte3.so等文件拷贝至Qt的plugins/sqldrivers目录中,Qt Creator仍然是无法识别此文件的,因此猜测,Qt操作sqlite实际上无需另外安装sqlite数据库,而仅仅需要编译Qt时将sqlite Driver作为Plugin编译进来即可。
【其他备忘】
Qt自带演示sql的Example中,共用了connection.h文件。在本文件中创建了sqlite数据库并向其中写入了数据。
其中:
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:");
这样生成的数据库文件是在内存当中的,在工程文件目录下找不到。如果要创建在工程目录下可见的数据库文件,应当:
db.setDatabaseName("data.db");
即可。
参考文档:
Qt 的sqlite数据库的学习
How do I make an SQLITE database programatically in Qt?
四. 交叉编译Qt程序并在mini2440开发板上运行
直接在Qt Creator中切换至Qt4.6.3(Embedded)工程中,点击build即可生成交叉编译版本的可执行程序cachedtable文件。
将cachedtable程序传入开发板中 ./cachedtable 运行,发现错误提示缺少共享库libts-0.0.so.0。这是因为mini2440中的环境变量全部为默认,并没有为Qt程序另外配置环境变量,参考Qt程序运行在mini2440开发板上一文,直接利用mini2440自带的,/bin目录下名为qt的脚本,这个脚本是友善之臂写的演示qt的程序。
将qt复制出来并重命名为qtenv,使用vi命令打开qtenv脚本,把28行删除,把29行改为:
./$1 -qws($1代表命令行的第一个参数)
这样使用这个脚本启动刚才的cachedtable程序:
#./qtenv cachedtable &
即可运行起来,其中 &符号表示后台运行。