[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:
1 2 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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
1 |
#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
1 |
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
1 2 |
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
1 |
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ę:
1 2 |
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:
1 |
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
1 2 3 4 5 6 7 8 9 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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