QT学习笔记-postgresq数据库l驱动移植到RK3568ARM开发板

QT学习笔记-postgresq数据库l驱动移植到RK3568ARM开发板

0、背景

在上一文《QT学习笔记-QT安装postgresql驱动》中介绍了在Windows环境下使用QT访问postgresql数据库时遇到驱动无法加载问题的解决办法,大体思路是对QT源码中数据库驱动的源码进行编译,要想通过编译需要依赖对应数据库的头文件和库(可以通过安装postgresql或者下载对应window版本的压缩包获得-就是已经编译好的),编译通过后就可以把生成的驱动文件放入plugin/sqldrivers的目录下,再把一些必须依赖的dll(libcrypto-1_1-x64.dll、libiconv-2.dll、libintl-9.dll、libpg.dll、libssl-1_1-x64.dll)放到所使用的QT编译套件(比如:D:\Qt\5.15.2\mingw81_64\bin)的bin目录下就可以正常访问postgresql数据库了。然而要想把postgresql驱动移植到ARM开发板就需要更复杂的一些步骤,本文介绍具体的移植过程。

1、搭建交叉编译环境

由于ARM开发板的内存资源和存储资源以及嵌入式操作系统的限制,我们不大可能在ARM开发板的系统上安装QT开发环境以及源码,ARM开发板通常作为最终的运行环境。我们用的笔记本或个人PC往往是X86处理器,因此在笔记本系统或个人PC中编译的QT程序是无法直接运行在ARM开发板上的。从开发电脑到ARM开发板是有2个关键的变化,1是操作系统从Windows变为了Linux,2是从X86处理器变为了ARM处理器。这就需要搭建一台交叉编译服务器(可以是一台独立的PC或者是虚拟机),交叉编译服务器的操作系统要为Linux,示意如下:
在这里插入图片描述

交叉编译环境的搭建主要是获得对应的交叉编译工具链,就是在X86处理器上运行的Linux系统中使用交叉编译工具链对X86的Windows下开发的源码进行交叉编译生成基于Arm处理器的Linux系统能够运行的目标程序。

通常我们管X86的Windows开发环境叫开发环境,X86的Linux环境叫交叉编译环境,Arm的Linux环境叫目标环境或运行环境。最简单搭建交叉编译环境的方式就是直接使用目标开发版操作系统的编译服务器作为交叉编译服务器。不过这个环境一般比较大,因为操作系统的源码非常大。要想用一个轻量级的交叉编译环境,还是建议自己搭建。

本文后面介绍的是直接采用的操作系统编译服务器作为交叉编译环境的。

2、交叉编译过程

1、我们知道Qt开发的源码,要生成可执行程序一般要通过2个步骤:

  1. 通过qmake生成Makefile
  2. 通过make对源码进行编译生成动态库和可执行程序

交叉编译的思路:首先我们要明白在开发环境中安装qt时自带的qmake是不能作为交叉编译用的,因为他生成的Makefile中所采用的gcc和g++编译器都是对应x86和windows的。再就是我们如果再交叉编译服务器(X86/Linux)上直接安装Linux版本的qt的话,这个qt自带的qmake也不能作为交叉编译用,因为他生成的Makefile中所采用的gcc和g++编译器都是对应x86和Linux的。因此我们首先要找到对应目标系统(Arm/Linux)的qmake才行。

2、我是通过buildroot构建目标操作系统的,因为要在目标系统中运行qt的程序,因此在构建过程中要把qt的环境编译到目标系统中,构建完毕后会在buildroot目录下生成output目标,我们可以采用这下面的qmake生成采用交叉编译器的Makefile,如下:
在这里插入图片描述

qmake的目录为:SDK/buildroot/output/rockchip_rk3568/host/bin/qmake
其中SDK表示编译目标Linux系统的源码目录
rockchip_rk3568对应的是芯片型号

3、我们先把qt源码部署到交叉编译环境中,如下:
在这里插入图片描述
4、通过vim修改psql.pro工程文件内容,注释掉QMAKE_USE += psql,如下:
在这里插入图片描述
然后按ESC,输入wq保存退出。

4、然后我们使用SDK/buildroot/output/rockchip_rk3568/host/bin/qmake生成Makefile,同时要执行依赖的libpq.so库的路径,如下:

SDK/buildroot/output/rockchip_rk3568/host/bin/qmake “LIBS+=SDK/buildroot/output/rockchip_rk3568/target/usr/lib/libpq.so” -o Makefile psql.pro
其中SDK表示编译目标Linux系统的源码目录
rockchip_rk3568对应的是芯片型号
SDK/buildroot/output/rockchip_rk3568/target/usr/lib/libpq.so文件是通过交叉编译工具对postgresql源码编译生成的针对目标系统(Arm/Linux)的库文件。

在这里插入图片描述
5、看一下Makfile的内容:
在这里插入图片描述

可以看到,这里的Makefile中指定的gcc/g++编译工具就是交叉编译工具,就是能生成Arm/Linux能运行的。
具体目录为:
SDK/buildroot/output/rockchip_rk3568/host/bin/aarch64-buildroot-linux-gnu-gcc
SDK/buildroot/output/rockchip_rk3568/host/bin/aarch64-buildroot-linux-gnu-g++
其中SDK表示编译目标Linux系统的源码目录
rockchip_rk3568对应的是芯片型号。

6、这时,再执行make就会采用交叉编译工具aarch64-buildroot-linux-gnu-gcc和aarch64-buildroot-linux-gnu-g++进行编译了,
编译完毕后,会生成libqsqlpsql.so,如下图:
在这里插入图片描述

目录:QtSrc/qtbase/src/plugins/sqldrivers/plugins/sqldrivers
其中QtSrc表示Qt的源码目录。
我这里虽然用的是Qt5.14.2的源码,但是我目标系统是Qt5.15.2的运行环境,不过这些数据库驱动的代码都没什么变化,因此没什么影响。

至此终于生成了支持目标系统(Arm/Linux)能够识别的数据库驱动库libqsqlpsql.so。

3、把数据库驱动部署到目标系统中

1、首先通过MobaXterm以SSH方式连接到目标系统(开发板系统)。
2、在/usr/lib/qt/plugins目录下创建目录sqldrivers。
3、把在交叉编译服务器中生成的QtSrc/qtbase/src/plugins/sqldrivers/plugins/sqldrivers/libqsqlpsql.so文件传到目标系统的/usr/lib/qt/plugins/sqldrivers目录下,如下:
在这里插入图片描述
至此,目标系统就支持Qt程序对postgresql数据库的访问了。

猜你喜欢

转载自blog.csdn.net/zlbdmm/article/details/129703313