编译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
说明
转载请注明出处!