注册
【技术分享】Linux环境下QT连接达梦数据库(QDM方式)
专栏/培训园地/ 文章详情 /

【技术分享】Linux环境下QT连接达梦数据库(QDM方式)

gjd 2023/10/09 3612 0 0
摘要

Qt是一个基于C++的跨平台软件开发框架。它为应用程序开发者提供建立艺术级图形用户界面所需的功能。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。
Qt具有优良的跨平台特性,支持下列操作系统: Microsoft Windows 95/98, Microsoft Windows NT, Linux, Solaris, SunOS, HP-UX, Digital UNIX (OSF/1, Tru64), Irix, FreeBSD, BSD/OS, SCO, AIX, OS390,QNX 等等。
QDM是达梦数据库提供的对 QT SQL 模块进行支持。 QT 通过 QT SQL 模块提供了对 SQL 数据库的支持,QT SQL 模块接口是独立于数据库的,它可以通过数据库驱动插件和不同的数据库接口进行通信。
安装。

一、下载安装包
操做系统:Centos7.6
所需软件包:
1、unixODBC-2.3.0.tar.gz
下载odbc网址:http://www.unixodbc.org/
2、qt-opensource-linux-x64-5.9.9.run
下载qt网址:https://download.qt.io/archive/qt/
二、配置环境
1、安装DM8,新建实例并启动数据库服务(略)
数据库信息:
端口号:5236
用户名:SYSDBA
密码:SYSDBA
安装路径:/opt/dmdbms
2、安装QT
在root用户下执行
./qt-opensource-linux-x64-5.9.9.run
​编译 QDM 需要引用 QT src 中的相关文件,所以编译前我们需要先安装 QT,并在安装时选择 Source 组件。
​​​​image.png
3、gcc和g++环境确认
​[root@localhost QtSql]# gcc –v
……
gcc version 7.3.1 20180303 (Red Hat 7.3.1-5) (GCC)

[root@localhost QtSql]# g++ -v
……
gcc version 7.3.1 20180303 (Red Hat 7.3.1-5) (GCC)
需确保GCC和G++的版本在5.4及以上,否则编译过程会报错,出现如下错误:
[root@localhost dm]# make debug

make -f Makefile.Debug

make[1]: Entering directory `/opt/Qt5.9.9/5.9.9/Src/qtbase/src/plugins/sqldrivers/dm'

g++ -pipe -g -std=c++1z -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -Wall -W -Wvla -Wdate-time -dM -E -o .moc/debug/moc_predefs.h /opt/Qt5.9.9/5.9.9/gcc_64/mkspecs/features/data/dummy.cpp

g++: error: unrecognized command line option ‘-std=c++1z’

g++: error: unrecognized command line option ‘-Wdate-time’

make[1]: *** [.moc/debug/moc_predefs.h] Error 1

make[1]: Leaving directory `/opt/Qt5.9.9/5.9.9/Src/qtbase/src/plugins/sqldrivers/dm'

make: *** [debug] Error 2

可以采取安装scl源的方法安装高版本gcc和g++,如下:
[root@localhost ~]# yum install centos-release-scl-rh
[root@localhost ~]# yum install centos-release-scl
[root@localhost ~]# yum search gcc
image.png

安装gcc和g
[root@localhost ~]# yum install devtoolset-7-gcc.x86_64
[root@localhost ~]# yum install devtoolset-7-gcc-c
.x86_64

执行scl命令使高版本gcc和g++生效
[root@localhost ~]# scl enable devtoolset-7 bash

再次检查版本,发现使用了高版本的gcc和g++,确认无误后进行后面的步骤
[root@localhost ~]# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
……
gcc version 7.3.1 20180303 (Red Hat 7.3.1-5) (GCC)
[root@localhost ~]# g++ -v
Using built-in specs.
COLLECT_GCC=g++
……
gcc version 7.3.1 20180303 (Red Hat 7.3.1-5) (GCC)

4、将qmake写入/etc/profile中
export PATH="$PATH:/opt/Qt5.9.9/5.9.9/gcc_64/bin"

二、部署QDM
1、下载QDM源码
QDM下载连接见:https://eco.dameng.com/download/?_blank
QDM源码下载好后,将QDM源码的目录拷贝到QDM目录下:
cp qt_src/plugins_sqldrivers/dm_56
/opt/Qt5.9.9/5.9.9/Src/qtbase/src/plugins/sqldrivers/

cp qt_src/sql_drivers/dm
/opt/Qt5.9.9/5.9.9/Src/qtbase/src/sql/drivers/
没有的目录自行创建,拷贝完成如下图所示:
image.png
image.png

2、编译QDM动态库
cd /opt/Qt5.9.9/5.9.9/Src/qtbase/src/plugins/sqldrivers/dm

qmake "INCLUDEPATH+=/opt/dmdbms/include" "LIBS+=/opt/dmdbms/include/libdmdpi.a -ldl"  "DEFINES+=DM64" "CONFIG+=debug_and_release" dm.pro

注意INCLUDEPATH和LIBS需要根据实际情况修改,指定达梦安装目录下的include目录,编译完成后会生成三个Makefile新文件
image.png
3、执行make debug编译
[root@localhost dm]# make debug

/opt/dmdbms/include/libdmdpi.a(ossema.o): In function `os_sema2_free_ex':

/home/dmops/build/svns/1646367691262/os/ossema.c:1023: undefined reference to `shm_unlink'

/opt/dmdbms/include/libdmdpi.a(ossema.o): In function `os_sema2_id_get_ex':

/home/dmops/build/svns/1646367691262/os/ossema.c:993: undefined reference to `shm_open'

/opt/dmdbms/include/libdmdpi.a(ossema.o): In function `os_sema2_create_low_ex':

/home/dmops/build/svns/1646367691262/os/ossema.c:904: undefined reference to `shm_open'

collect2: error: ld returned 1 exit status

make[1]: *** [../plugins/sqldrivers/libqsqldm.so] Error 1

make[1]: Leaving directory `/opt/Qt5.9.9/5.9.9/Src/qtbase/src/plugins/sqldrivers/dm'

make: *** [debug] Error 2
可能会出现上述错误,这是由于部分库未导入导致的,进行如下修改:
vim /opt/Qt5.9.9/5.9.9/Src/qtbase/src/plugins/sqldrivers/dm/Makefile.debug

在Makefile.debug文件中找到这样一行
LIBS = $(SUBLIBS) /opt/dmdbms/include/libdmdpi.a -ldl -L/opt/Qt5.9.9/5.9.9/gcc_64/lib -lQt5Sql -lQt5Core -lpthread

并在最后加上-lrt,如下:
LIBS = $(SUBLIBS) /opt/dmdbms/include/libdmdpi.a -ldl -L/opt/Qt5.9.9/5.9.9/gcc_64/lib -lQt5Sql -lQt5Core -lpthread -lrt

4、将生成的libqsqldm.so文件拷贝到/opt/Qt5.9.9/5.9.9/gcc_64/plugins/sqldrivers/ 下
cp ../plugins/sqldrivers/libqsqldm.so /opt/Qt5.9.9/5.9.9/gcc_64/plugins/sqldrivers/

5、查看依赖库是否完整
[root@localhost sqldrivers]# ldd libqsqldm.so

linux-vdso.so.1 =>  (0x00007ffea2d9a000)

libdl.so.2 => /lib64/libdl.so.2 (0x00007f47e5993000)

libQt5Sql.so.5 => /opt/Qt5.9.9/5.9.9/gcc_64/plugins/sqldrivers/./../../lib/libQt5Sql.so.5 (0x00007f47e574c000)

libQt5Core.so.5 => /opt/Qt5.9.9/5.9.9/gcc_64/plugins/sqldrivers/./../../lib/libQt5Core.so.5 (0x00007f47e5005000)

libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f47e4de9000)

librt.so.1 => /lib64/librt.so.1 (0x00007f47e4be1000)

libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f47e48d9000)

libm.so.6 => /lib64/libm.so.6 (0x00007f47e45d7000)

libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f47e43c1000)

libc.so.6 => /lib64/libc.so.6 (0x00007f47e3ff3000)

/lib64/ld-linux-x86-64.so.2 (0x00007f47e6800000)

libz.so.1 => /lib64/libz.so.1 (0x00007f47e3ddd000)

libicui18n.so.56 => /opt/Qt5.9.9/5.9.9/gcc_64/plugins/sqldrivers/./../../lib/libicui18n.so.56 (0x00007f47e3944000)

libicuuc.so.56 => /opt/Qt5.9.9/5.9.9/gcc_64/plugins/sqldrivers/./../../lib/libicuuc.so.56 (0x00007f47e358c000)

libicudata.so.56 => /opt/Qt5.9.9/5.9.9/gcc_64/plugins/sqldrivers/./../../lib/libicudata.so.56 (0x00007f47e1ba9000)

libgthread-2.0.so.0 => /lib64/libgthread-2.0.so.0 (0x00007f47e19a7000)

libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x00007f47e1691000)

libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f47e142f000)
如果存在某些库缺失,执行find / -name “so文件名”找到该文件,放到/lib64下即可

三、QT连接达梦数据库测试
1、新建工程
image.png
2、选择工程类型
image.png
3、工程目录如下:
image.png
4、在test1.pro文件里添加这两行
QT += sql
INCLUDEPATH += /opt/Qt5.9.9/5.9.9/gcc_64/include/QtSql
5、测试代码如下:
#include

#include

#include

#include

int main(int argc, char *argv[])

{

QCoreApplication a(argc, argv);

QSqlDatabase db = QSqlDatabase::addDatabase("QDM");

db.setHostName("localhost");

db.setPort(5236);

db.setDatabaseName("dm8");

db.setUserName("SYSDBA");

db.setPassword("SYSDBA");

if (db.open())

qDebug() << "connect ok!";

else
    {
        qDebug() << "connect fail! " << db.lastError().text().toLatin1();
    }
    return a.exec();
}
6、连接达梦数据库成功
image.png

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服