[QT] CentOS 7 환경에서 QOCI (Oracle DB) Driver 빌드
필수 환경
QT 설치
QT 공식홈페이지 에서 QT를 다운로드 받아 설치한다.
설치 과정 중 필수로 Source 를 선택하여 QT소스코드가 함께 설치되도록한다.
본 게시글에서는 QT 5.9.1
버전을 사용한다.
설치 경로는 /opt/Qt5.9.1
이다.
Oracle SDK
Oracle Instant Client 에서 Oracle Instant Client를 다운받는다.
- Basic Package (ZIP)
- SDK Package (ZIP)
본 게시글에서는 21.1.0.0.0
버전을 사용하였다.
Basic Package는 /opt/instantclient
, SDK Package 는 opt/instantclient/sdk
에 압축 해제 하였다.
빌드
OCI의 소스코드가 위치한 경로로 이동한다.
cd /opt/Qt5.9.1/5.9.1/Src/qtbase/src/plugins/sqldrivers/oci
이동 후, oci.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
CONFIG += c++11
INCLUDEPATH += /opt/instantclient/sdk/include
DEPENDPATH += /opt/instantclient/
LIBS += -L"/opt/instantclient" -lclntsh
include(../qsqldriverbase.pri)
MakeFile을 생성한다.
qmake
CentOS 7의 기본 GCC 버전이 4.8이므로, 바로 빌드 시 -Wdate-time
및 c++1z
오류가 발생한다.
g++: error: unrecognized command line option '-std=c++1z'
g++: error: unrecognized command line option '-Wdate-time'
따라서, MakeFile 의 내용을 수정한다
c++1z
->c++11
-Wdate-time
-> `` (제거)
이후, 빌드를 수행한다.
make
빌드 로그가 콘솔에 출력되며, 빌드 성공 시 ../plguins/sqldrivers/
(/opt/Qt5.9.1/5.9.1/Src/qtbase/src/plugins/sqldrivers/plugins/sqldrivers
) 폴더에 libqsqloci.so
파일이 생성된다.
생성된 libqsqloci.so
파일을 추가한다.
cd /opt/Qt5.9.1/5.9.1/Src/qtbase/src/plugins/sqldrivers/plugins/sqldrivers
cp libqsqloci.so /opt/Qt5.9.1/5.9.1/gcc_64/plugins/sqldrivers
테스트
OCI의 설치가 완료되면, 테스트용 프로젝트를 생성하여 빌드 후 테스트를 진행한다.
프로젝트 파일
test.cpp*
#include <QtSql>
int main() {
QSqlDatabase mes_db;
mes_db = QSqlDatabase::addDatabase("QOCI","TEST");
mes_db .setHostName("localhost");
mes_db .setPort(1521);
mes_db .setUserName("test");
mes_db .setPassword("test");
mes_db .setDatabaseName("orcl");
if(!mes_db .open()){
qDebug()<<"open false";
}else {
qDebug()<<"open db";
}
}
첨부된 압축파일의 압축 해제 후, test.cpp에서, oracle의 접속정보를 현재 설정된 상태와 맞게 변경 한 뒤, 빌드 및 실행한다.
open db
가 출력되면, 정상적으로 작업이 완료되었음을 의미하며, open false
출력 시 접속 정보가 잘못되었음을 의미한다.
Plugin이 잘 로드되었는지 확인하기 위해선, 아래 사진과 같이 Run Environment에 QT_DEBUG_PLUGINS
를 1로 설정한다.
실행결과
QFactoryLoader::QFactoryLoader() checking directory path "/usr/lib64/kde4/plugins/sqldrivers" ...
QFactoryLoader::QFactoryLoader() checking directory path "/usr/lib/kde4/plugins/sqldrivers" ...
QFactoryLoader::QFactoryLoader() checking directory path "/opt/Qt5.9.1/5.9.1/gcc_64/plugins/sqldrivers" ...
QFactoryLoader::QFactoryLoader() looking at "/opt/Qt5.9.1/5.9.1/gcc_64/plugins/sqldrivers/libqsqlite.so"
Found metadata in lib /opt/Qt5.9.1/5.9.1/gcc_64/plugins/sqldrivers/libqsqlite.so, metadata=
{
"IID": "org.qt-project.Qt.QSqlDriverFactoryInterface",
"MetaData": {
"Keys": [
"QSQLITE"
]
},
"className": "QSQLiteDriverPlugin",
"debug": false,
"version": 329985
}
Got keys from plugin meta data ("QSQLITE")
QFactoryLoader::QFactoryLoader() looking at "/opt/Qt5.9.1/5.9.1/gcc_64/plugins/sqldrivers/libqsqlmysql.so"
Found metadata in lib /opt/Qt5.9.1/5.9.1/gcc_64/plugins/sqldrivers/libqsqlmysql.so, metadata=
{
"IID": "org.qt-project.Qt.QSqlDriverFactoryInterface",
"MetaData": {
"Keys": [
"QMYSQL3",
"QMYSQL"
]
},
"className": "QMYSQLDriverPlugin",
"debug": false,
"version": 329985
}
Got keys from plugin meta data ("QMYSQL3", "QMYSQL")
QFactoryLoader::QFactoryLoader() looking at "/opt/Qt5.9.1/5.9.1/gcc_64/plugins/sqldrivers/libqsqloci.so"
Found metadata in lib /opt/Qt5.9.1/5.9.1/gcc_64/plugins/sqldrivers/libqsqloci.so, metadata=
{
"IID": "org.qt-project.Qt.QSqlDriverFactoryInterface",
"MetaData": {
"Keys": [
"QOCI8",
"QOCI"
]
},
"className": "QOCIDriverPlugin",
"debug": false,
"version": 329985
}
Got keys from plugin meta data ("QOCI8", "QOCI")
QFactoryLoader::QFactoryLoader() looking at "/opt/Qt5.9.1/5.9.1/gcc_64/plugins/sqldrivers/libqsqlpsql.so"
Found metadata in lib /opt/Qt5.9.1/5.9.1/gcc_64/plugins/sqldrivers/libqsqlpsql.so, metadata=
{
"IID": "org.qt-project.Qt.QSqlDriverFactoryInterface",
"MetaData": {
"Keys": [
"QPSQL7",
"QPSQL"
]
},
"className": "QPSQLDriverPlugin",
"debug": false,
"version": 329985
}
Got keys from plugin meta data ("QPSQL7", "QPSQL")
loaded library "/opt/Qt5.9.1/5.9.1/gcc_64/plugins/sqldrivers/libqsqloci.so"
open db
QLibraryPrivate::unload succeeded on "/opt/Qt5.9.1/5.9.1/gcc_64/plugins/sqldrivers/libqsqloci.so"
위와 같이
Got keys from plugin meta data ("QOCI8", "QOCI")
QFactoryLoader::QFactoryLoader() looking at "/opt/Qt5.9.1/5.9.1/gcc_64/plugins/sqldrivers/libqsqlpsql.so"
Found metadata in lib /opt/Qt5.9.1/5.9.1/gcc_64/plugins/sqldrivers/libqsqlpsql.so, metadata=
{
"IID": "org.qt-project.Qt.QSqlDriverFactoryInterface",
"MetaData": {
"Keys": [
"QPSQL7",
"QPSQL"
]
},
"className": "QPSQLDriverPlugin",
"debug": false,
"version": 329985
}
QOCI
관련 메시지가 출력되면, 정상적으로 Driver가 로드된 것이다.