Programming/QT

[QT] CentOS 7 환경에서 QOCI (Oracle DB) Driver 빌드

후유증 2021. 6. 28. 18:34

필수 환경

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 Packageopt/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-timec++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의 설치가 완료되면, 테스트용 프로젝트를 생성하여 빌드 후 테스트를 진행한다.

프로젝트 파일

oratest.tar.gz
503 B

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가 로드된 것이다.