注册
麒麟V10+QT5.9.9+DM8 QODBC搭建
专栏/技术分享/ 文章详情 /

麒麟V10+QT5.9.9+DM8 QODBC搭建

南瓜 2023/11/16 2164 0 0
摘要

环境介绍
kylin10 地址192.168.255.109(安装QT)root/Dameng@123
Centos7 地址192.168.255.102(安装DM8)root/root123

所需软件包
unixODBC-2.3.0.tar.gz
qt-opensource-linux-x64-5.9.9.run

下载odbc网址
下载qt网址

安装DM8,初始化并启动数据库,省略......
库信息记录:
地址:192.168.255.102
端口:5237
用户名:SYSDBA
密码:SYSDBA
安装路径:/opt/dmdbms

在麒麟V10机器,创建目录 /opt/dmdbms
在Centos7机器把/opt/dmdbms/bin目录拷贝到kylin10的/opt/dbdbms目录下
[root@os_node2 root]# scp -r /opt/dmdbms/bin 192.168.255.109:/opt/dbdbms

源码编译形式安装unixODBC,配置连接DM8
(使用源码形式,是因为后边编译libdsqlodbc.so包时要使用它的安装路径)
执行 odbcinst -j 可看到kylin10中原本就有ODBC(可通过yum安装)

[root@localhost ~]# odbcinst -j
unixODBC 2.3.7
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8

删除unixODBC

yum remove unixODBC

上传unixODBC-2.3.0.tar.gz到/opt目录下, 并解压

cd /opt
tar -xf unixODBC-2.3.0.tar.gz

进入/opt/unixODBC-2.3.0执行编译、安装

./configure --prefix=/usr/local/unixODBC
make && make install

查看安装好的unixODBC-2.3.0配置文件路径

[root@localhost unixODBC-2.3.0]# odbcinst -j
unixODBC 2.3.0
DRIVERS............: /usr/local/unixODBC/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/unixODBC/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/unixODBC/etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8

编辑文件/usr/local/unixODBC/etc/odbcinst.ini,添加如下内容

[DM8 ODBC DRIVER]
Description = ODBC DRIVER FOR DM8
DRIVER = /opt/dmdbms/bin/libdodbc.so

编辑文件/usr/local/unixODBC/etc/odbc.ini,添加如下内容

[dm8]
Description = DM8 ODBC DSND
DRIVER = DM8 ODBC DRIVER
SERVER = 192.168.255.102
UID = SYSDBA
PWD = SYSDBA
TCP_PORT = 5237

编辑/etc/profile,添加如下内容

export PATH="$PATH:/usr/local/unixODBC/lib/bin"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/opt/dmdbms/bin"

使环境变量生效

source /etc/profile

连接数据库, 如下表示正常

[root@localhost unixODBC-2.3.0]# isql dm8
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select 1;
+------------+
| 1          |
+------------+
| 1          |
+------------+
SQLRowCount returns 1
1 rows fetched
SQL>

安装QT
参考博客
http://t.zoukankan.com/BASE64-p-14332282.html

预安装

yum -y install mesa-libGL-devel mesa-libGLU-devel freeglut-devel

上传qt安装包到/opt目录下,修改权限

chmod 777 /opt/qt-opensource-linux-x64-5.9.9.run

断掉linux的网络(不要连接互联网,不然安装时会提示输入账户等)

执行安装,随后图形化安装自行出现,一步步向下走即可完成, 默认安装目录/opt/Qt5.9.9

cd /opt/
./qt-opensource-linux-x64-5.9.9.run

安装完成后启动qtcreator

cd /opt/Qt5.9.9/Tools/QtCreator/bin
./qtcreator

在欢迎模块,搜索示例库 clock,打开后若发现无法构建和运行,出现报错
no suitable kits

此报错是缺失c、c++库导致的,通过yum安装即可
查询c、c++编译器的版本

gcc -v
g++ -v
gcc --version
g++ --version

安装c、c++编译器

yum install gcc
yum install gcc-c++

注:缺失c、c++是在centos7上安装QT后发现的。

在桌面创建文件夹qt_code
创建一个项目,名称study_01路径 /root/桌面/qt_code

编辑qt_code.pro文件,添加如下内容

QT += sql

编辑main.cpp文件,覆盖原来的内容

#include "mainwindow.h"

#include <QApplication>
#include <QCoreApplication>
#include <QtSql>
#include <QDebug>
#include <QSqlDatabase>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
    db.setHostName("192.168.255.102");
    db.setPort(5237);
    db.setDatabaseName("DAMENG");
    db.setUserName("SYSDBA");
    db.setPassword("SYSDBA");
    if (db.open())
        qDebug() << "connect ok!";
    else
    {
        qDebug() << "connect fail! " << db.lastError().text().toLatin1();
    }

    return a.exec();
}

构建成功、运行时报错

22:11:56: Starting /root/桌面/qt_code/build-study_01-Desktop_Qt_5_9_9_GCC_64bit-Debug/study_01 ...
QSqlDatabase: QODBC driver not loaded
QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QPSQL QPSQL7
connect fail! "Driver not loaded Driver not loaded"

1700142922297.png

可观察到QODBC驱动未加载,且无可用的QODBC驱动
出现该报错是由于安装qt自带的libdsqlodbc.so老旧导致,需要重新编译生成

参考博客
https://blog.csdn.net/PTK_Feng/article/details/103218122?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-6-103218122-blog-109064628.pc_relevant_blogantidownloadv1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-6-103218122-blog-109064628.pc_relevant_blogantidownloadv1&utm_relevant_index=9

https://blog.csdn.net/qq_25945437/article/details/79490684

该路径下缺少ODBC驱动
/opt/Qt5.9.9/5.9.9/Src/qtbase/src/plugins/sqldrivers/odbc

1700142972342.png

通过YUM安装

[root@os_node2 odbc]# yum search qt | grep -i odbc
qt-odbc.i686 : ODBC driver for Qt's SQL classes
qt-odbc.x86_64 : ODBC driver for Qt's SQL classes
qt3-ODBC.i686 : ODBC drivers for Qt 3's SQL classes
qt3-ODBC.x86_64 : ODBC drivers for Qt 3's SQL classes
qt5-qtbase-odbc.i686 : ODBC driver for Qt5's SQL classes
qt5-qtbase-odbc.x86_64 : ODBC driver for Qt5's SQL classes

尝试这个无用
yum install -y qt5-qtbase-odbc*
make install

卸载已安装的odbc 2.3.1
[root@os_node2 unixODBC-2.3.11]# yum list installed | grep -i odbc
qt5-qtbase-odbc.x86_64 5.9.7-5.el7_9 @updates
unixODBC.x86_64 2.3.1-14.el7 @base
[root@os_node2 unixODBC-2.3.11]#
[root@os_node2 unixODBC-2.3.11]#
[root@os_node2 unixODBC-2.3.11]# yum remove unixODBC.x86_64
以编译形式安装2.3.0, 过程省略... 安装路径在/usr/local/unixODBC

编译生成包

所有DB驱动源码目录
/opt/Qt5.9.9/5.9.9/Src/qtbase/src/plugins/sqldrivers/

进入odbc源码目录
cd /opt/Qt5.9.7/5.9.7/Src/qtbase/src/plugins/sqldrivers/odbc

qmake程序的位置
/opt/Qt5.9.9/5.9.9/gcc_64/bin/qmake

驱动要放置的目录
/opt/Qt5.9.9/5.9.9/gcc_64/plugins/sqldrivers/

有报错
生成libqsqlodbc.so

cd /opt/Qt5.9.9/5.9.9/Src/qtbase/src/plugins/sqldrivers/odbc
qmake "INCLUDEPATH+=/usr/local/unixODBC/include" "LIBS+=-L/usr/local/unixODBC/lib -lodbc"

实际执行产生报错

[root@localhost odbc]# /opt/Qt5.9.9/5.9.9/gcc_64/bin/qmake "INCLUDEPATH+=/usr/local/unixODBC/include" "LIBS+=-L/usr/local/unixODBC/lib -lodbc"
Info: creating stash file /opt/Qt5.9.9/5.9.9/Src/qtbase/src/plugins/sqldrivers/.qmake.stash
Cannot read /opt/Qt5.9.9/5.9.9/Src/qtbase/src/plugins/sqldrivers/qtsqldrivers-config.pri: No such file or directory
Project ERROR: Library 'odbc' is not defined.

解决办法
1.屏蔽掉/opt/Qt5.9.9/5.9.9/Src/qtbase/src/plugins/sqldrivers/qsqldriverbase.pri文件中内容
1700143038274.png

2.屏蔽掉/opt/Qt5.9.9/5.9.9/Src/qtbase/src/plugins/sqldrivers/odbc/odbc.pro文件中内容
1700143064132.png

重新执行,再无报错,make编译下

cd /opt/Qt5.9.9/5.9.9/Src/qtbase/src/plugins/sqldrivers/odbc
qmake "INCLUDEPATH+=/usr/local/unixODBC/include" "LIBS+=-L/usr/local/unixODBC/lib -lodbc"
make

注:在centos7中执行make报错,gcc 版本 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)

[root@os_node2 odbc]# make
g++ -c -pipe -O2 -std=c++1z -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -Wall -W -Wvla -Wdate-time -D_REENTRANT -fPIC -DUNICODE -DQT_NO_NARROWING_CONVERSIONS_IN_CONNECT -DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_ASCII -DQT_NO_EXCEPTIONS -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -DQT_NO_DEBUG -DQT_PLUGIN -DQT_SQL_LIB -DQT_CORE_LIB -I. -I/usr/local/unixODBC/include -I/opt/Qt5.9.9/5.9.9/gcc_64/include/QtSql/5.9.9 -I/opt/Qt5.9.9/5.9.9/gcc_64/include/QtSql/5.9.9/QtSql -I/opt/Qt5.9.9/5.9.9/gcc_64/include/QtCore/5.9.9 -I/opt/Qt5.9.9/5.9.9/gcc_64/include/QtCore/5.9.9/QtCore -I/opt/Qt5.9.9/5.9.9/gcc_64/include -I/opt/Qt5.9.9/5.9.9/gcc_64/include/QtSql -I/opt/Qt5.9.9/5.9.9/gcc_64/include/QtCore -I.moc -I/opt/Qt5.9.9/5.9.9/gcc_64/mkspecs/linux-g++ -o .obj/qsql_odbc.o qsql_odbc.cpp
g++: 错误:unrecognized command line option ‘-std=c++1z’
g++: 错误:unrecognized command line option ‘-Wdate-time’
make: *** [.obj/qsql_odbc.o] 错误 1

可通过升级gcc版本解决(未做尝试)
https://blog.csdn.net/weixin_42744102/article/details/107219137

#qmake新编译出来的
[root@localhost odbc]# ls -l /opt/Qt5.9.9/5.9.9/Src/qtbase/src/plugins/sqldrivers/plugins/sqldrivers/libqsqlodbc.so
-rwxr-xr-x 1 root root 123864  6月 26 18:23 /opt/Qt5.9.9/5.9.9/Src/qtbase/src/plugins/sqldrivers/plugins/sqldrivers/libqsqlodbc.so
#自己从QT自带的地方拷贝的
[root@localhost odbc]# ls -l /opt/Qt5.9.9/5.9.9/gcc_64/plugins/sqldrivers/libqsqlodbc.so
-rwxr-xr-x 1 root root 119336  6月 26 15:12 /opt/Qt5.9.9/5.9.9/gcc_64/plugins/sqldrivers/libqsqlodbc.so
#原来自带的
[root@localhost odbc]# ls -l /opt/Qt5.9.9/Tools/QtCreator/lib/Qt/plugins/sqldrivers/libqsqlodbc.so
-rwxr-xr-x 1 root root 119336 12月 10  2019 /opt/Qt5.9.9/Tools/QtCreator/lib/Qt/plugins/sqldrivers/libqsqlodbc.so

qmake编译生成的包的路径
/opt/Qt5.9.9/5.9.9/Src/qtbase/src/plugins/sqldrivers/plugins/sqldrivers/libqsqlodbc.so

拷贝到驱动路径

cp /opt/Qt5.9.9/5.9.9/Src/qtbase/src/plugins/sqldrivers/plugins/sqldrivers/libqsqlodbc.so /opt/Qt5.9.9/5.9.9/gcc_64/plugins/sqldrivers/

再执行编译、运行,报错情况
1700143141441.png

此时QODBC驱动未加载,但已有可用的QODBC驱动

检查ldd包有缺失依赖 libodbc.so.1 => not found

cd /opt/Qt5.9.9/5.9.9/gcc_64/plugins/sqldrivers/
[root@localhost sqldrivers]# ldd libqsqlodbc.so
        linux-vdso.so.1 (0x00007ffd4b3fd000)
        libodbc.so.1 => not found
        libQt5Sql.so.5 => /opt/Qt5.9.9/5.9.9/gcc_64/plugins/sqldrivers/./../../lib/libQt5Sql.so.5 (0x00007fe69eca0000)
        libQt5Core.so.5 => /opt/Qt5.9.9/5.9.9/gcc_64/plugins/sqldrivers/./../../lib/libQt5Core.so.5 (0x00007fe69e559000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fe69e538000)
        libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007fe69e385000)
        libm.so.6 => /lib64/libm.so.6 (0x00007fe69e200000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fe69e1e7000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fe69e026000)
        libz.so.1 => /lib64/libz.so.1 (0x00007fe69e00c000)
        libicui18n.so.56 => /opt/Qt5.9.9/5.9.9/gcc_64/plugins/sqldrivers/./../../lib/libicui18n.so.56 (0x00007fe69db73000)
        libicuuc.so.56 => /opt/Qt5.9.9/5.9.9/gcc_64/plugins/sqldrivers/./../../lib/libicuuc.so.56 (0x00007fe69d7bb000)
        libicudata.so.56 => /opt/Qt5.9.9/5.9.9/gcc_64/plugins/sqldrivers/./../../lib/libicudata.so.56 (0x00007fe69bdd6000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fe69bdd1000)
        libgthread-2.0.so.0 => /lib64/libgthread-2.0.so.0 (0x00007fe69bdcc000)
        libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x00007fe69bca9000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fe69ef1a000)
        libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fe69bc35000)
[root@localhost sqldrivers]#
[root@localhost sqldrivers]#

将/opt/dmdbms/bin/libdodbc.so复制为libodbc.so.1,放在QT驱动目录下, 检查包再无缺失

[root@localhost sqldrivers]# ln -s /opt/dmdbms/bin/*odbc* libodbc.so.1
[root@localhost sqldrivers]# ldd libqsqlodbc.so
        linux-vdso.so.1 (0x00007ffc1a59e000)
        libodbc.so.1 (0x00007fe559e36000)
        libQt5Sql.so.5 => /opt/Qt5.9.9/5.9.9/gcc_64/plugins/sqldrivers/./../../lib/libQt5Sql.so.5 (0x00007fe559bef000)
        libQt5Core.so.5 => /opt/Qt5.9.9/5.9.9/gcc_64/plugins/sqldrivers/./../../lib/libQt5Core.so.5 (0x00007fe5594a8000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fe55946f000)
        libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007fe5592bc000)
        libm.so.6 => /lib64/libm.so.6 (0x00007fe559137000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fe55911e000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fe558f5d000)
        libdmdpi.so => /opt/dmdbms/bin/libdmdpi.so (0x00007fe5582ae000)
        libdmfldr.so => /opt/dmdbms/bin/libdmfldr.so (0x00007fe557643000)
        libdmelog.so => /opt/dmdbms/bin/libdmelog.so (0x00007fe55743b000)
        libdmutl.so => /opt/dmdbms/bin/libdmutl.so (0x00007fe557224000)
        libdmclientlex.so => /opt/dmdbms/bin/libdmclientlex.so (0x00007fe556ff1000)
        libdmos.so => /opt/dmdbms/bin/libdmos.so (0x00007fe556dc3000)
        libdmcvt.so => /opt/dmdbms/bin/libdmcvt.so (0x00007fe5566e3000)
        libdmstrt.so => /opt/dmdbms/bin/libdmstrt.so (0x00007fe5564ce000)
        librt.so.1 => /lib64/librt.so.1 (0x00007fe5564c3000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fe5564bc000)
        libz.so.1 => /lib64/libz.so.1 (0x00007fe5564a2000)
        libicui18n.so.56 => /opt/Qt5.9.9/5.9.9/gcc_64/plugins/sqldrivers/./../../lib/libicui18n.so.56 (0x00007fe556009000)
        libicuuc.so.56 => /opt/Qt5.9.9/5.9.9/gcc_64/plugins/sqldrivers/./../../lib/libicuuc.so.56 (0x00007fe555c51000)
        libicudata.so.56 => /opt/Qt5.9.9/5.9.9/gcc_64/plugins/sqldrivers/./../../lib/libicudata.so.56 (0x00007fe55426e000)
        libgthread-2.0.so.0 => /lib64/libgthread-2.0.so.0 (0x00007fe554267000)
        libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x00007fe554144000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fe55a07d000)
        libdmmem.so => /opt/dmdbms/bin/libdmmem.so (0x00007fe553f34000)
        libdmcalc.so => /opt/dmdbms/bin/libdmcalc.so (0x00007fe553cab000)
        libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fe553c35000)

再次运行报错,缺失包
1700143223523.png

将UnixODBC的lib目录添加到环境变量$LD_LIBRARY_PATH中去
/usr/local/unixODBC/lib/

运行时又报错,QODBC3连不上
1700143249974.png

是由于main代码中写得, DAMENG不对
db.setDatabaseName("DAMENG");
改为ODBC里配置的即可
db.setDatabaseName("dm8");

最终QODBC方式连接DM8成功
1700143275407.png

附录:

麒麟V10操作添加到/etc/profile的环境变量记录

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/opt/dmdbms/bin:/usr/local/unixODBC/lib/"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/opt/Qt5.9.9/5.9.9/gcc_64/plugins/sqldrivers"
export PATH="$PATH:/opt/Qt5.9.9/Tools/QtCreator/bin"
#export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/opt/Qt5.9.9/Tools/QtCreator/lib/Qt/plugins/sqldrivers"
export PATH="$PATH:/usr/local/unixODBC/bin"
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服