欢迎使用CSDN-markdown编辑器

来源:互联网 发布:算法博弈论中文版 pdf 编辑:程序博客网 时间:2024/06/05 05:54

在嵌入式ARM开发板EasyArm-Imx283下移植使用QT自带的QSqlite


最近开发手头上的周立功的EasyArm-Imx283开发板,需要用到一些数据的存取,由于懒得自己建立文件数据管理体系,于是想到使用QT自带的轻量级数据库QSqlite。
按照相关资料在上位机上进行开发,一切正常,但是在下载到开发板后,直接报错退出,错误提示如下:

QSqlDatabase: QSQLITE driver not loaded                                         QSqlDatabase: available drivers: 

在网上搜索相关问题后,发现按照网上的做法,即使拷贝了sqldrivers目录到板子后,在283板子上也没有效果。
于是只好自行想办法解决了:

1. 重新编译QT

首先, QSqlDatabase: available drivers:这句提示的冒号后面是空的,表明QT根本就没有识别到有数据库的驱动,很多网上有问题的人后面都有“SQLITE”,“MYSQL”等字段,说明他们的板子是可以识别驱动,只是有别的问题。

不用理会别人的问题,还是从我手里的板子本身入手查找问题,因为板子上的QT库是出厂自带的,所以我并不清楚其编译时使用的命令,因此无法识别驱动有可能是被编译成了不带驱动的形式,或者其他未知的问题。

在qt-everywhere-opensource-src-4.7.3.tar.gz解压目录下,输入./configure -help,有如下的几句话:

    -no-sql-<driver> ... Disable SQL <driver> entirely.    -qt-sql-<driver> ... Enable a SQL <driver> in the QtSql library, by default                         none are turned on.    -plugin-sql-<driver> Enable SQL <driver> as a plugin to be linked to                         at run time.                         Possible values for <driver>:                         [  db2 ibase mysql oci odbc psql sqlite sqlite2 sqlite_symbian tds ]

如果在./configure后面加入-no-sql-<driver>命令则将禁止driver标明的驱动,-qt-sql-<driver>将会把对应的驱动直接加载在QtSql库中,-plugin-sql-<driver>将会把驱动编译为运行时加载的插件。

我为了方便使用了第二条命令,直接把sqlite驱动编译进了QtSql库中,命令为:-qt-sql-sqlite

即在周立功《嵌入式Linux开发教程 (上册)》中的移植Qt篇中的configure命令里添加此命令,下面是完整的bulid-qt文件内容,如果没有此文件,在与configure文件同目录下生成一个即可:

./configure \    -prefix /home/vmuser/nfs/qt-4.7.3-arm               \    -opensource -confirm-license -release -embedded arm     \    -xplatform qws/linux-arm-gnueabi-g++ -no-qt3support     \    -depths 16,18,24,32 -no-qvfb -no-svg -no-cups -no-mmx       \    -no-3dnow -no-sse -no-sse2 -no-glib -no-openssl -shared     \    -no-largefile -no-accessibility -no-xrender -no-webkit      \    -no-gtkstyle -nomake examples -nomake docs -nomake demos    \    -plugin-mouse-pc -plugin-mouse-tslib -little-endian     \    -plugin-mouse-linuxtp -fast -lrt -qt-mouse-tslib        \    -qt-sql-sqlite                          \    -D QT_NO_QWS_CURSOR                     \    -D QT_QWS_CLIENTBLIT                        \    -I /home/vmuser/nfs/tslib/tslib/include             \    -I /home/vmuser/nfs/tslib/tslib/lib

这里的-prefix为将来想把编译好的文件存储的地方,可以自行修改。
然后在该目录下的mkspec/qws/linux-arm-gnueabi-g++/qmake.conf改为如下:

## qmake configuration for building with arm-none-linux-gnueabi-g++#include(../../common/g++.conf)include(../../common/linux.conf)include(../../common/qws.conf)# modifications to g++.confQMAKE_CC                = arm-none-linux-gnueabi-gcc -ltsQMAKE_CXX               = arm-none-linux-gnueabi-g++ -ltsQMAKE_LINK              = arm-none-linux-gnueabi-g++ -ltsQMAKE_LINK_SHLIB        = arm-none-linux-gnueabi-g++ -lts# modifications to linux.confQMAKE_AR                = arm-none-linux-gnueabi-ar cqsQMAKE_OBJCOPY           = arm-none-linux-gnueabi-objcopyQMAKE_STRIP             = arm-none-linux-gnueabi-stripload(qt_config)QMAKE_INCDIR = /home/vmuser/nfs/tslib/tslib/includeQMAKE_LIBDIR = /home/vmuser/nfs/tslib/tslib/lib

最后两行是添加的触摸屏驱动,请根据自己的地址进行修改。而arm-none-linux-gnueabi也需要根据自己的交叉编译器进行修改。

此后回到build-qt的目录,执行./build-qt,将会自动调用configure并使用指定的选项构造make文件。在make文件生成后,输入make命令,将开始编译,过程比较长。

在编译完成后,执行make install会把生成的文件复制到-prefix指定的位置。

2. 将QT复制到开发板

将对应目录下的/lib目录下的内容复制到开发板即可,至于如何传输文件,一般都是使用nfs,而nfs如何传输文件,网上有很多资料,已经超出了本文章的讨论范围,可以自行查找,只要几行命令即可。

这里有个问题,就是仅lib目录下的库文件就有96M左右,还没有算上fonts目录下的字体,而开发板仅有128M的片上存储资源,基本是装不下的。此处可以看出,周立功提供的默认QT库比这个小很多,肯定是阉割了许多功能的。而我的项目是需要为客户提供TF卡的,因此仅需将库复制到TF卡上就可以了。

在283板子上,将TF卡插进去后,会自动生成/media/sd-mmcblk0p1/的目录,这里为了自动识别如果有TF卡并且TF卡上有QT库就使用TF卡上的QT库,否则使用默认的板子上的QT库,需要进行如下的工作:

首先在TF卡目录下建立一个“qt”目录,此后在/media/sd-mmcblk0p1/qt/生成一个名为myversion的文件,内容任意,仅需要这个文件名。并对开发板的/etc/profile中QT环境变量进行如下修改:

if [ -f /media/sd-mmcblk0p1/qt/myversion ]then        echo "Using Qt on TF card"        export QTDIR=/media/sd-mmcblk0p1/qt        export QT_PLUGIN_PATH=$QTDIR/plugins        export QT_QWS_FONTDIR=$QTDIR/lib/fonts        export LD_LIBRARY_PATH=$QTDIR/libelse        echo "Use default Qt dir"        export QT_QWS_FONTDIR=/usr/lib/fonts        export QTDIR=/usr/lib        export QT_PLUGIN_PATH=$QTDIR/pluginsfi

如果存在/media/sd-mmcblk0p1/qt/myversion文件则使用TF卡上的QT库以及字库,否则使用开发板的QT库及字库。保存文件重启开发板后即可生效,如果不想重启,只需执行source /etc/profile

下面是拷贝过程:
将上位机生成的lib目录,包括子目录内容,复制到/media/sd-mmcblk0p1/qt/,此后在qt目录下应该出现lib目录,lib目录内含有所有.so.*的文件即可。

此时如果TF卡使用的是fat文件系统,在拷贝中可能会提示建立link文件失败,这是因为fat文件系统不支持链接文件,如果使用的是其他文件系统那么可以直接跳过下面到“3. 字体和其他问题”。(为何使用fat文件系统?因为客户的windows只能识别fat文件系统…)

目前不能建立链接文件我也没有什么好办法,暂时只能用笨办法,就是把所有.so.4.7.3的库分别复制成.so.4.7和.so.4以及.so这几个文件,虽然很占空间,但好在对TF卡容量来说不算什么。此后运行程序就不会报库错误了。也可以试探性的删除几个库,我目前尝试是把所有.so.4.7.3和.so.4.7都删掉,不会报库错误。

3. 字体和其他问题

由于TF卡够大,因此可以随意添加我们所需的字体了,此前一个字体动辄十几兆,不能随意向开发板复制,使用TF卡就没有这个顾虑了。将windows下的字体文件传输到上位机,再从上位机传输到/media/sd-mmcblk0p1/qt/lib/fonts即可,至于如何在QT中使用中文等字体,可以在网上搜集相关资料。

如果此前在开发板上跑程序没有提示过“FT_New_Face failed with index …”而移植到TF卡后出现这个错误提示,甚至可能会显示乱码,这主要是由缺乏默认的字体文件而造成的,可以有两种解决方法,首先可以在QT内指定自己希望的字体(前提是fonts内有此字体),如此不会显示乱码但是启动时还会出现警告,其次可以将开发板的/usr/lib/fonts下所有字体复制到TF卡中的字体目录/media/sd-mmcblk0p1/qt/lib/fonts,如此就不会报错,英文不指定字体的话不会乱码了,缺点就是占用磁盘。

0 0
原创粉丝点击