在嵌入式系统中使用QT开发上位机应用时不可避免的会涉及访问各种数据库的场景,而服务端数据库的种类则有多种可能(Oracle、Postgresql、MySql、SQLServer),本文就介绍一下如何实现在Linux Arm环境下实现QT程序通过ODBC驱动访问SQLServer数据库的。
开发环境操作系统:windows10专业版
QT版本:5.15.2
QT安装目录:D:\Qt
交叉编译环境操作系统:Ubuntu18.4
QT版本:5.15.2
QT安装目录:/opt/Qt
目标环境操作系统:Linux4.19 Arm 64
QT版本:5.15.2
由于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环境叫目标环境或运行环境。最简单搭建交叉编译环境的方式就是直接使用目标开发版操作系统的编译服务器作为交叉编译服务器。不过这个环境一般比较大,因为操作系统的源码非常大。要想用一个轻量级的交叉编译环境,还是建议自己搭建。
本文后面介绍的是直接采用的操作系统编译服务器作为交叉编译环境的。
1、unixODBC的官网地址为:https://www.unixodbc.org/
如下图:
2、如要下载最新版本,则点击左侧菜单中的Download,如下图:
3、如果要下载历史版本,可以通过ftp://ftp.unixodbc.org/pub/unixODBC网址下载需要的版本,如下图:
4、因为Linux Arm目标环境中安装的版本是2.3.4,为了一致,所以在交叉编译服务器上我也下载这个版本,如下:
cd /usr/local/src
wget ftp://ftp.unixodbc.org/pub/unixODBC/unixODBC-2.3.4.tar.gz
tar -xzvf unixODBC-2.3.4.tar.gz
ls
1、在官网的下载页面已经介绍了基本的安装步骤,如下:
1.1 默认安装如下:
./configure
make
make install
1.2 指定目录安装如下:
./configure --prefix=/usr/local/unixODBC
make
make install
1.3 指定配置路径安装如下:
./configure --sysconfdir=/etc
make
make install
1、要想对c/c++源码进行交叉编译,首先要在交叉编译服务器上安装配置交叉编译工具链。这里就不介绍安装过程了,为了能够保证与目标系统一致,我使用的就是构建目标操作系统时生成的交叉编译环境,目录为:LinuxSDK/buildroot/output/rockchip_rk3568/host/bin/。如下图:
上图中可以看出:
交叉编译工具链所在目录为:/home/zhenglb/Linux/wg_rk356x_linux_sdk/buildroot/output/rockchip_rk3568/host/bin
交叉编译工具链名称为:aarch64-buildroot-linux-gnu
2、需要把交叉编译器所在的路径添加到PATH环境变量中,方便系统能找到交叉编译器,如下:
echo $PATH
export PATH=$PATH:/home/zhenglb/Linux/wg_rk356x_linux_sdk/buildroot/output/rockchip_rk3568/host/bin
echo $PATH
在对c/c++源码进行交叉编译的时候,关键的一步是设置configure的参数,其中有三个参数-build、-host、-target的区别如下:
- build:执行代码编译的主机,正常的话就是你的主机系统。这个参数一般由config.guess来猜就可以。当然自己指定也可以。
- host:编译出来的二进制程序所执行的主机,因为绝大多数是本机编译,本机执行,所以这个值就等于build。只有交叉编译的时候(也就是本机编译,其他系统机器执行)才会build和host不同。用host指定运行主机。
- target:这个选项只有在建立交叉编译环境的时候用到,正常编译和交叉编译都不会用到。他用build主机上的编译器,编译一个新的编译器(binutils, gcc,gdb等),这个新的编译器将来编译出来的其他程序将运行在target指定的系统上。
1、下面就看一下在交叉编译服务器上的交叉编译安装步骤,如下:
cd unixODBC-2.3.4
./configure --prefix=/usr/local/arm/unixODBC --host=aarch64-buildroot-linux-gnu
make
make install
日志太长,就不截图了。–prefix指定了安装位置,–host指定了交叉编译工具链
3、安装完毕后,就会在/usr/local/arm目录下看到unixODBC目录了,如下图:
- 在/usr/local/arm/unixODBC/include目录下是我们交叉编译odbc.pro所依赖的unixODBC的头文件
- 在/usr/local/arm/unixODBC/lib目录下是我们交叉编译odbc.pro所依赖的库
1、首先在交叉编译服务器上进入odbc.pro源码目录,如下:
cd /opt/Qt/5.15.2/Src/qtbase/src/plugins/sqldrivers/odbc
ls
如下图:
2、修改odbc.pro文件添加指定unixODBC头文件及库文件的位置的相关代码,如下:
vim odbc.pro
odbc.pro修改的内容
#注释下行
#QMAKE_USE += odbc
#增加以下2行
INCLUDEPATH += /usr/local/arm/unixODBC/include
LIBS += -L/usr/local/arm/unixODBC/lib -lodbc
如下图:
3、按:wq,保存退出odbc.pro文件的编辑
4、使用交叉编译工具链下的qmake生成Makefile,如下:
这里我使用的是目标Linux操作系统构建时生成的交叉编译工具链,位置为:
LinuxSDK/buildroot/output/rockchip_rk3568/host/bin/qmake,如下图:
(如果在此终端下已配置了交叉编译工具链的PATH环境变量,可以直接qmake)具体使用如下:
5、然后输入make命令进行交叉编译,交叉编译完毕后会在原木odbc目录同级目录生成plugins/sqldrivers目录,交叉编译生成的库文件就这这个目录中,如下图:
1、freeTDS的官网地址为:https://www.freetds.org/
如下图:
2、通过ftp://ftp.freetds.org/pub/freetds/可以查看历史版本,如下图:
3、在开发环境下可以直接点击右侧菜单中的Stable Release进行下载。或者通过右键查看属性获取到下载地址,如下图:
4、在交叉编译服务器上通过wget直接下载freetds到交叉编译服务器中,如下:
cd /usr/local/src
wget ftp://ftp.freetds.org/pub/freetds/stable/freetds-1.3.19.tar.gz
如下图:
tar -xzvf freetds-1.3.19.tar.gz
ls
1、首先,如果PATH环境变量中没有指定交叉编译器的路径,则需要把交叉编译器所在的路径添加到PATH环境变量中,方便系统能找到交叉编译器,如下:
echo $PATH
export PATH=$PATH:/home/zhenglb/Linux/wg_rk356x_linux_sdk/buildroot/output/rockchip_rk3568/host/bin
echo $PATH
1、下面就看一下在交叉编译服务器上的交叉编译安装步骤,如下:
cd freetds-1.3.19
./configure --prefix=/usr/local/arm/freetds --host=aarch64-buildroot-linux-gnu --with-tdsver=7.1 --disable-libiconv
make
make install
日志太长,就不截图了。–prefix指定了安装位置,–host指定了交叉编译工具链
3、安装完毕后,就会在/usr/local/arm目录下看到freetds目录了,如下图:
如果目标系统中没有unixODBC,则部署方式与6.2 部署freeTDS类似。因为我的目标系统已经有unixODBC了,并且安装时没有指定安装目录,是属于默认安装的。
因此配置文件路径为/etc/odbc.ini、/etc/odbcinst.ini。so库在/usr/lib目录下
1、首先把第5步在交叉编译服务器上交叉编译freeTDS后的安装目录/usr/local/arm/freetds压缩一下,如下:
cd /usr/local/aram
tar -cvf freetds.tar freetds
2、把压缩包freetds.tar从交叉编译服务器下载后,传到目标系统(Linux Arm)中。
注意:一定要相同目录
把第4步在交叉编译服务器上交叉编译QT源码中的odbc.pro生成的libqsqlodbc.so复制到目标系统(Linux Arm)的qt的插件目录下,如下图:
复制前:
复制后:
修改/usr/local/aram/freetds/etc/freetds.conf,添加如下内容:
[SQLSERVER]
host = xxx.xxx.xxx.xxx
port = 1433
tds version = 8.0
client charset = UTF-8
修改/etc/odbcinst.ini,添加如下内容:
[FreeTDS]
Description = FreeTDS unixODBC Driver
Driver = /usr/local/arm/freetds/lib/libtdsodbc.so
UsageCount = 1
修改/etc/odbc.init,添加如下内容:
[testdsn]
Driver = FreeTDS
Description = MS SQL Server
Servername = testdsn
Database = test