Qt SQLite在I.mx8上使用问题

项目场景:

i.mx8上Qt应用使用sqlite。


问题描述:

之前也经常用sqlite,但是没有这次这么曲折,具体的原因是宿主机编译运行都正常,放入嵌入式Linux就异常,异常也是一个接一个。


原因分析:

缺少必要的动态库。

如果项目较大,先把项目抛开,用最小程序验证到底是什么问题,避免夹杂了项目中的错误使用导致的error影响基本判断。


解决方案:

1.sql模块未添加,pro文件中加上sql的包含,如果是多层级项目,任何用到的子项目都需要包含。

2.放入嵌入式linux上,开始报错:并不是之前遇到的Qt动态库找不到。

复制代码
QSqlDatabase: QSQLITE driver not loaded
QSqlDatabase: available drivers: 
数据库连接失败
QSqlQuery::prepare: database not open
QSqlQuery::value: not positioned on a valid record

3.ldd+app,看到调用的Qtsql库是存在的。

4.使用最小测试程序,查看到底是什么原因。

复制代码
#include <QCoreApplication>
#include <QSqlDatabase>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    qDebug() << "驱动是否可用:" << db.isValid();
    return a.exec();
}

5.最小程序验证后发现,依然报错驱动未找到,说明问题不在Qt SQL核心库,而是SQLite驱动插件本身问题。

复制代码
QSqlDatabase: QSQLITE driver not loaded
QSqlDatabase: available drivers: 

6.检查后发现根本没有sqldrivers这个文件夹。

复制代码
ls /usr/lib/qt6/plugins/sqldrivers/libqsqlite.so

7.那就找libqsqlite.so添加进去,第一步,下载源码,要下载对应的版本,6.3.3就下6.3.2源码(并没有6.3.3的源码,但是编出来的库显示6.3.3),版本不对的话是不兼容的。

复制代码
# 下载 Qt 6.3.3 源码
wget https://download.qt.io/archive/qt/6.3/6.3.2/single/qt-everywhere-src-6.3.2.tar.xz
tar -xvf qt-everywhere-src-6.3.2.tar.xz

8.解压源码到opt目录。

复制代码
mkdir -p /opt/Qt/6.3.2
tar -xvf ~/Downloads/qt-everywhere-src-6.3.2.tar.xz -C /opt/Qt/6.3.2 --strip-components=1

9.新建一个文件夹放编译好的驱动,不要去源码中新建,避免源码污染。

复制代码
mkdir -p ~/qt6.3.2-sqldrivers-build
cd ~/qt6.3.2-sqldrivers-build

10.配置交叉编译工具链,sysroot中包含了厂家已经编译好的驱动等,一般包括sqlite3.husr/include)和 libsqlite3.sousr/lib)。

复制代码
source /home/tronlong/i.mx8mp/SDK/environment-setup-aarch64-poky-linux

11.执行CMake指向Qt6.3.2的源码,生成Makefile,下面是我验证可用的cmake文件,替换自己的交叉编译工具链和环境路径即可。

复制代码
  cmake /opt/Qt/6.3.2/qtbase/src/plugins/sqldrivers \
  -DCMAKE_SYSTEM_NAME=Linux \
  -DCMAKE_SYSTEM_PROCESSOR=aarch64 \
  -DCMAKE_SYSROOT=${SDKTARGETSYSROOT} \
  -DCMAKE_C_COMPILER=aarch64-poky-linux-musl-gcc \
  -DCMAKE_CXX_COMPILER=aarch64-poky-linux-musl-g++ \
  -DCMAKE_INSTALL_PREFIX=/opt/Qt/6.3.2-imx8mp \
  -DQt6_DIR=/opt/Qt/6.3.2/lib/cmake/Qt6 \
  -DQT_VERSION_MAJOR=6 \
  -DQT_VERSION_MINOR=3 \
  -DQT_VERSION_PATCH=2 \
  -DQT_FEATURE_sql_sqlite=ON \
  -DSQLITE3_INCLUDE_DIR=${SDKTARGETSYSROOT}/usr/include \
  -DSQLITE3_LIBRARY=${SDKTARGETSYSROOT}/usr/lib/libsqlite3.so

12.交叉编译sql驱动。

复制代码
make -j4

13.编译成功,显示是开发板上可以用的库。

14.放入板子上,要放在当前板子环境变量目录下,否则要在板子声明它的路径

复制代码
/usr/lib/plugins/sqldrivers

15.最后,测试完成!

相关推荐
全栈老石9 小时前
拆解低代码引擎核心:元数据驱动的"万能表"架构
数据库·低代码
倔强的石头_1 天前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou642 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤3 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
爱可生开源社区4 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1774 天前
《从零搭建NestJS项目》
数据库·typescript
加号35 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏5 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐5 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再5 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip