centos7 Qt5编译oracle驱动

编译oracle驱动

前提条件

1.安装了Qt源码

1.安装了oracle数据库

步骤

1.找到oracle驱动工程目录,本机目录地址如下:

D:\Dev\Qt\Qt5.9.0\5.9\Src\qtbase\src\plugins\sqldrivers\oci\oci.pro

1.用QtCreator打开次工程,修改.pro文件,默认如下:

TARGET = qsqloci

HEADERS += $$PWD/qsql_oci_p.h

SOURCES += $$PWD/qsql_oci.cpp $$PWD/main.cpp

QMAKE_USE += oci

darwin:QMAKE_LFLAGS += -Wl,-flat_namespace,-U,_environ

OTHER_FILES += oci.json

PLUGIN_CLASS_NAME = QOCIDriverPlugin

include(../qsqldriverbase.pri)

其中qsqldriverbase.pri:

QT  = core core-private sql-private

PLUGIN_TYPE = sqldrivers

load(qt_plugin)

DEFINES += QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII

修改后如下:

TEMPLATE = lib

TARGET = $$qtLibraryTarget(qsqloci)

QT  = core core-private sql-private

CONFIG += build_all

DEFINES += QT_PLUGIN QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII

HEADERS += $$PWD/qsql_oci_p.h

SOURCES += $$PWD/qsql_oci.cpp $$PWD/main.cpp

INCLUDEPATH += $(ORACLE_HOME)/oci/include

#D:/Dev/oracle/product/12.2.0/dbhome_1

#QMAKE_USE += oci

QMAKE_LFLAGS += $(ORACLE_HOME)/oci/lib/msvc/oci.lib

darwin:QMAKE_LFLAGS += -Wl,-flat_namespace,-U,_environ

OTHER_FILES += oci.json

1.编译并拷贝文件

编译成功后将最终生成的qsqlocid.dll和qsqloci.dll拷贝到以下目录:

D:\Dev\Qt\Qt5.9.0\5.9\msvc2015_64\plugins\sqldrivers

改动说明

1.为何去除qsqldriverbase.pri

由于该文件中有load(qt_plugin)这段代码,而这段代码是为了加载一个qmake.conf文件,根据原始pro的情况来看,该配置文件中应当包含如下配置:

TEMPLATE = lib

DEFINES += QT_PLUGIN

并且应当包含对如下已定义变量的使用:

QMAKE_USE

PLUGIN_CLASS_NAME

PLUGIN_TYPE

由于本人在qmake时总是提示找不到对应的.conf文件,提示如下:

error: Project has no top-level .qmake.conf file.

故不再包含qsqldriverbase.pri文件,而是选择手动配置,即手动添加如下代码:

TEMPLATE = lib

TARGET = $$qtLibraryTarget(qsqloci)

QT  = core core-private sql-private

CONFIG += build_all

DEFINES += QT_PLUGIN QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII

其中包含qsqldriverbase.pri中可用的部分,另外qtLibraryTarget函数会自动为debug版本的dll添加d后缀,build_all是为了同时编译debug和release版本,QT_PLUGIN宏在qsql_oci_p.h中用到,必须定义.

1.添加oracle的sdk路径

ORACLE_HOME是为本机的环境变量,实际指向的路径如INCLUDEPATH下的注释所示。QMAKE_LFLAGS链接标志指明要链接的oci库文件,如上文所述QMAKE_USE变量应该被qmake.conf文件做了处理,由于本人未包含qsqldriverbase.pri文件,故这里需要明确指定库文件的详细路径.

测试

1.查询可用数据库驱动

代码如下:

QStringList drivers = QSqlDatabase::drivers();

foreach(QString driver, drivers)

qDebug() <<"\t" << driver;

打印结果:

"QSQLITE"

"QMYSQL"

"QMYSQL3"

"QOCI"

"QOCI8"

"QODBC"

"QODBC3"

"QPSQL"

"QPSQL7"

说明编译的oracle驱动信息被成功读取!

2.连接测试

代码如下:

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

db.setPort(1521);

db.setHostName("127.0.0.1");

db.setDatabaseName("orcl");

db.setUserName("c##scott");

db.setPassword("tiger");

bool ok = db.open();

if(ok) {

qDebug() << "connect sucess!";

}

打印结果:

connect sucess!

编译环境

1.操作系统:windows10

1.Qt版本:5.9.0

1.oracle版本:12c

说明

转载请注明出处!



作者:惘客
链接:https://www.jianshu.com/p/0c818ec2c86b
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

以下是我centos7、oracle12c的环境oci.pro修改

#TARGET = qsqloci

#HEADERS += $$PWD/qsql_oci_p.h
#OURCES += $$PWD/qsql_oci.cpp $$PWD/main.cpp

#QMAKE_USE += oci

#darwin:QMAKE_LFLAGS += -Wl,-flat_namespace,-U,_environ

#OTHER_FILES += oci.json

#PLUGIN_CLASS_NAME = QOCIDriverPlugin
#include(../qsqldriverbase.pri)

TEMPLATE = lib
TARGET = $$qtLibraryTarget(qsqloci)
QT  = core core-private sql-private
CONFIG += build_all
DEFINES += QT_PLUGIN QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII
HEADERS += $$PWD/qsql_oci_p.h
SOURCES += $$PWD/qsql_oci.cpp $$PWD/main.cpp
INCLUDEPATH+=$(ORACLE_HOME)/rdbms/public $(ORACLE_HOME)/rdbms/demo
LIBS+=-L$(ORACLE_HOME)/lib -lclntsh
INCLUDEPATH += $(ORACLE_HOME)/oci/include
#D:/Dev/oracle/product/12.2.0/dbhome_1
#QMAKE_USE += oci
#QMAKE_LFLAGS += $(ORACLE_HOME)/oci/lib/msvc/oci.lib
darwin:QMAKE_LFLAGS += -Wl,-flat_namespace,-U,_environ
OTHER_FILES += oci.json

猜你喜欢

转载自blog.csdn.net/wojiuguowei/article/details/89292607