环境介绍
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
安装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"
可观察到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
通过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文件中内容
2.屏蔽掉/opt/Qt5.9.9/5.9.9/Src/qtbase/src/plugins/sqldrivers/odbc/odbc.pro文件中内容
重新执行,再无报错,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/
再执行编译、运行,报错情况
此时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)
再次运行报错,缺失包
将UnixODBC的lib目录添加到环境变量$LD_LIBRARY_PATH中去
/usr/local/unixODBC/lib/
运行时又报错,QODBC3连不上
是由于main代码中写得, DAMENG不对
db.setDatabaseName("DAMENG");
改为ODBC里配置的即可
db.setDatabaseName("dm8");
最终QODBC方式连接DM8成功
附录:
麒麟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"
文章
阅读量
获赞