O informatyce, po swojemu, inaczej

[Qt] Instalacja QOCI dla Qt Creator

Witam, jako, że długi czas już tego nie robiłem, ale po instalacji nowej paczki Qt musiałem na nowo skonfigurować biblioteki odpowiedzialne za sterowanie połączeniem z bazą danych Oracle. W dokumentacji Qt nie wiedzieć czemu sposób jest… niepełny, przynajmniej w wypadku Windowsa. Dlatego też, ze względu na słabą pamięć, jak i dla potomnych pełny poradnik jak poprawnie postawić bazę na localhoscie Oracle, a także jak poprawnie, szybko i bezboleśnie przejść przez proces tworzenia bibliotek qsqloci.dll.

Jeżeli spotkałeś się z następującym komunikatem podczas używania Qt:

QSqlDatabase: QOCI driver not loaded
QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QODBC QODBC3 QPSQL QPSQL7

to ten wpis jest właśnie dla Ciebie.

Przygotowywanie serwera Oracle.

Cały proces przebiega dosyć intuicyjnie. Na początku ściągam paczkę Oracle Database Express Edition 11g Release 2. Po zaakceptowaniu warunków i ściągnięciu wypakowuję całą zawartość wraz z katalogiem DISK1 instaluję na domyślnych ustawieniach. Aby sprawdzić, czy wszystko działa, jeżeli nie zmieniałeś portów i zostawiłeś wszystko na ustawieniach domyślnych, to po kliknięciu w ikonę „Get Started” w starcie powinieneś/powinnaś zobaczyć okno główne do zarządzania sesjami i użytkownikami bazy danych.

Następnie pobieram Oracle Database 11g Release 2 Client (11.2.0.1.0) for Microsoft Windows (32-bit) client. Podobnie, jak wyżej akceptuję, ściągam i instaluję praktycznie na domyślnych ustawieniach. Z jednym wyjątkiem. Zauważyłem, że gdy podpiąłem do laptopa dysk zewnętrzny instalator chciał tam się rozpakować. Więc tylko się upewniam, że rozpakuje się w najprostszej ścieżce tj. „C\app\Username„. Z możliwych pakietów do wyboru wybieram Runtime.

Teraz przechodzimy do instalacji Qt.

Jeżeli posiadałeś wcześniej Qt, niż samą bazę, to nic się nie stało. Musisz tylko się upewnić, że do paczki z nr wersji masz zainstalowany element Source. Możesz to sprawdzić modyfikując pakiet Qt z poziomu panelu sterowania lub wejść bezpośrednio w Qt Maintenance Tool, albo po prostu sprawdź, czy w katalogu wersji znajduje się katalog Src.

Ze względu na to, że mam już wszystko zainstalowane pokażę Ci teraz na zrzucie ekranu jaki element jest wymagany, abyś mógł/mogła rozpocząć tworzenie bibliotek qsqloci.

Source: Owned by the author

Mingw, przygotwanie projektu, tworzenie bibliotek

Teraz kiedy mamy już wszystko przygotowane szukamy pliku oci.pro. Jeżeli postępowałeś na domyślnych ustawieniach to powinien on znajdować się w

C:\Qt\5.9.2\Src\qtbase\src\plugins\sqldrivers\oci

Samemu katalogowi całemu pamiętamy, aby zdjąć atrybut „tylko do odczytu” oraz zastosować to do plików i podkatalogów.

Jego zawartość jest taka:

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)

Twoim zadaniem jest zakomentowanie wiersza

#QMAKE_USE += oci

 

Dygresja

Jeżeli tego nie robiłeś wcześniej zapewne już wiesz, że przy użyciu komendy qmake oci.pro sktukowało to spotkaniem się z problemem pokroju

Project ERROR: Library 'oci’ is not defined.

Dlatego też istotne jest zakomentowanie tego wiersza. Dla początkującego – wiersz w plikach *.pro robimy poprzez postawienie znaku #.

Uruchamiamy Qt 5.9 for Desktop (MinGW 5.3.0 32 bit). Przechodzimy do katalogu już nam znanego oci za pomocą komendy

cd C:\Qt\5.9.2\Src\qtbase\src\plugins\sqldrivers\oci

Teraz mamy dwa, a w zasadzie 3 sposoby dodania zmiennych do makefile.debug i release. Pierwszy to wpisanie po prostu po kolei poleceń w cmd

set INCLUDE=%INCLUDE%;c:\oracle\oci\include
set LIB=%LIB%;c:\oracle\oci\lib\msvc

lub też wywołanie jednej długiej komendy z poleceniem

qmake "INCLUDEPATH+=C:\app\Bartosz\product\11.2.0\client_1\oci\include" "LIBS+=-LC:\app\Bartosz\product\11.2.0\client_1\oci\lib\msvc" oci.pro

na forum spotkałem się z tym, aby dodać też trzeci parametr, którego nie zastaniemy w tych plikach, to jest -loci. U mnie niestety to nie działało, więc w następnym kroku dodaję ten parametr ręcznie.

Otwieramy pliki Makefile.Release i Makefile.Debug w notatniku i wierszach zaczynających się od LIBS szukamy naszej ścieżki z drugiego parametru i zaraz za nią po spacji dopisujemy -loci. Zapewne domyślasz się, że trzecim sposobem jest własna ingerencja w powyższe pliki i uzupełnienie powyższymi ścieżkami.

Pamiętaj!

U mnie była to ścieżka C:\app\Bartosz , u Ciebie będzie tam Twoja nazwa użytkownika, a oprócz tego możesz już być w posiadaniu nowszego wydania, więc numer następnego katalogu też ulegnie zmianie.

Po pomyślnym wykonaniu polecenia qmake oci.pro otrzymasz informację:

Info: creating stash file C:\Qt\5.9.2\Src\qtbase\src\plugins\sqldrivers\.qmake.stash
Cannot read C:/Qt/5.9.2/Src/qtbase/src/plugins/sqldrivers/qtsqldrivers-config.pri: Nie mo?na odnale?? okre?lonego pliku.

Nie przejmuj się tym i wykonaj następne polecenie:

mingw32-make

Porada

Jeżeli kiedyś już podejmowałeś próby tworzenia bibliotek i skończyły się one fiaskiem spróbuj najpierw przed poleceniem qmake użyć komendy mingw32-make clean. Jeżeli nadal nie będzie działaś musisz odinstalować i zainstalować ponownie Qt

Przykładowy wydruk konsoli po poprawnym przeprowadzeniu powyższej konfiguracji i uruchomieniu polecenia mingw32-make

C:\Qt\5.9.2\Src\qtbase\src\plugins\sqldrivers\oci>mingw32-make
mingw32-make -f Makefile.Release all
mingw32-make[1]: Entering directory 'C:/Qt/5.9.2/Src/qtbase/src/plugins/sqldrivers/oci'
mingw32-make[1]: Nothing to be done for 'all'.
mingw32-make[1]: Leaving directory 'C:/Qt/5.9.2/Src/qtbase/src/plugins/sqldrivers/oci'
mingw32-make -f Makefile.Debug all
mingw32-make[1]: Entering directory 'C:/Qt/5.9.2/Src/qtbase/src/plugins/sqldrivers/oci'
g++ -shared -Wl,-subsystem,windows -Wl,--out-implib,C:\Qt\5.9.2\Src\qtbase\src\plugins\sqldrivers\plugins\sqldrivers\libqsqlocid.a -o ..\plugins\sqldrivers\qsqlocid.dll .obj/debug/qsql_oci.o .obj/debug/main.o .obj/debug/moc_qsql_oci_p.o -LC:\utils\my_sql\my_sql\lib -LC:\utils\postgresql\pgsql\lib -LC:\app\Bartosz\product\11.2.0\client_1\oci\lib\msvc -loci -LC:\Qt\5.9.2\mingw53_32\lib C:\Qt\5.9.2\mingw53_32\lib\libQt5Sqld.a C:\Qt\5.9.2\mingw53_32\lib\libQt5Cored.a .obj\debug\qsqlocid_resource_res.o
mingw32-make[1]: Leaving directory 'C:/Qt/5.9.2/Src/qtbase/src/plugins/sqldrivers/oci'

Następnie wykonujesz polecenie mingw-32 install, oto jego wyniki przykładowe

C:\Qt\5.9.2\Src\qtbase\src\plugins\sqldrivers\oci>mingw32-make install
mingw32-make -f Makefile.Release install
mingw32-make[1]: Entering directory 'C:/Qt/5.9.2/Src/qtbase/src/plugins/sqldrivers/oci'
copy /y ..\plugins\sqldrivers\qsqloci.dll C:\Qt\5.9.2\mingw53_32\plugins\sqldrivers\qsqloci.dll
1 file(s) copied.
C:\Qt\5.9.2\mingw53_32\bin\qmake.exe -install qinstall C:\Qt\5.9.2\Src\qtbase\src\plugins\sqldrivers\lib\cmake\Qt5Sql\Qt5Sql_QOCIDriverPlugin.cmake C:\Qt\5.9.2\mingw53_32\lib\cmake\Qt5Sql\Qt5Sql_QOCIDriverPlugin.cmake
mingw32-make[1]: Leaving directory 'C:/Qt/5.9.2/Src/qtbase/src/plugins/sqldrivers/oci'
mingw32-make -f Makefile.Debug install
mingw32-make[1]: Entering directory 'C:/Qt/5.9.2/Src/qtbase/src/plugins/sqldrivers/oci'
copy /y ..\plugins\sqldrivers\qsqlocid.dll C:\Qt\5.9.2\mingw53_32\plugins\sqldrivers\qsqlocid.dll
1 file(s) copied.
C:\Qt\5.9.2\mingw53_32\bin\qmake.exe -install qinstall C:\Qt\5.9.2\Src\qtbase\src\plugins\sqldrivers\lib\cmake\Qt5Sql\Qt5Sql_QOCIDriverPlugin.cmake C:\Qt\5.9.2\mingw53_32\lib\cmake\Qt5Sql\Qt5Sql_QOCIDriverPlugin.cmake
mingw32-make[1]: Leaving directory 'C:/Qt/5.9.2/Src/qtbase/src/plugins/sqldrivers/oci'

Gratulacje, właśnie poprawnie skonfigurowałeś serwer Oracle, a także stworzyłeś biblioteki potrzebne do pracy dla Qt, czyli qsqloci dla QOCI.

Materiał opracowany na podstawie:
– własnego doświadczenia
– https://forum.qt.io/topic/80928/problem-building-oci-plugin-for-qt-5-9-1/12
– https://forum.qt.io/topic/84654/brakujący-plik-qtsqldrivers-podczas-ładowania-oci/3