QT学习笔记-oracle oci数据库驱动交叉编译并移植到RK3568ARM开发板
- 0、背景
- 1、搭建交叉编译环境
- 2、交叉编译过程
- 3、把数据库驱动部署到目标系统中
0、背景
在上一文《QT学习笔记-QT安装oracle oci驱动》中介绍了在Windows环境下使用QT访问oracle数据库时遇到驱动无法加载问题的解决办法,大体思路是对QT源码中数据库驱动的源码oci进行编译,要想通过编译需要依赖对应数据库的头文件和库(可以通过下载oracle instant client),编译通过后就可以把生成的驱动文件放入plugin/sqldrivers的目录下)并且把oracle instant cient目录配置到LD_LIBRARY_PATH环境变量中,或者在程序中指定oracle instnat client的oci.dll位置就可以正常访问postgresql数据库了。然而要想把oracle oci驱动移植到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个步骤:
- 通过qmake生成Makefile
- 通过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、下载oracle instant client
4.1 首先要下载oracleclient,因为在编译oci驱动时要依赖oracleclient中的库和头文件。下载地址为:
https://www.oracle.com/database/technologies/instant-client/downloads.html
如下图:
Oracle Instant Client的下载要根据操作系统版本和Oracle服务器版本匹配才行。我开发环境是Windows10 64位系统,因此选择的是Instant Client for Microsoft Windows (x64)
4.2 点击后会出现Oracle Instant Client版本选择,如下图:
不同的Oracle Instant Client版本支持的Oracle服务器的版本也不相同,我用的Oracle服务器版本是11.2,这里选择的版本是Version 19.xx.x.x.x,我之前下载的是19.19,现在截图的时候已经是19.20,差别不大。
4.3 可以看到有BasicPackage、SQL*Plus Package、Tools Package、SDK Package、JDBC Supplement Package、ODBC Package等包的下载,如下图:
4.5 然后把这4个压缩包上传到交叉编译服务器的/opt/oracleclient_arm64/instantclient_19_19这个目录下,如下图:
4.6 使用unzip命令解压这4个压缩包(basic和sdk这2个是必须要解压的),如下图:
unzip instantclient-basic-linux.arm64-19.19.0.0.0dbru.zip
unzip instantclient-sdk-linux.arm64-19.19.0.0.0dbru.zip
5、通过vim修改psql.pro工程文件内容,注释掉QMAKE_USE += psql,如下:
一定要注意,oci在Linux下编译依赖的库为clntsh,不同于windows下依赖oci。
然后按ESC,输入wq保存退出。
6、然后在oci源码目录下使用交叉编译环境下的qmake生成Makefile,如下图:
7、输入make命令进行编译,如下图:
8、编译完毕后,会生成libqsqloci.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数据库的访问了。