C++ QT MySQL kompilacja

0

Witam,

Przedstawię od razu problem: Mam kłopot z biblioteką - właściwie jej kompilacją - mysql pod Qt i mingw32. Otóż piszę program w którym muszę połączyć się z bazą danych na serwerze. Baza danych to mysql (Jako iż wcześniej pracowałem na SQLITE to nie było problemu bo ten "jest w" Qt, no ale działa jakby lokalnie. Chyba, że istnieje sposób na umieszczenie bazy danych na serwerze i obsługa jej w SQLITE ). Nie mogę się połączyć z bazą danych bo przy próbie kompilacji i uruchomienia programu - dostaję komunikat od kompilatora:

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

oraz mój komunikat z qDebug():

"ERROR LOG (mainwindow): " (OpenDataBaseUser) ==> Nie mozna połączyc sie z bazą danych

Jasne jest, że nie ma sterownika od bazy danych. Zainstalowałem sobie całe "środowisko" MySQL (pakiet dla dewelopera więc Connector.C++ 1.1 MySQL Server 5.7 itp mam w sourcach od MySQL). Muszę sobie tą dll-kę skompilować. Odpalam konsolę "Qt 5.9.2 for Desktop (MinGW 5.3.0 32 bit)" z folderu Qt.

Przechodzę sobie:

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

Ustalam sobie zmienne:

set con_mysql=C:\\PROGRA~1\\MySQL\\MYSQLC~1.1
set main_mysql=C:\\PROGRA~1\\MySQL\\MYSQLS~1.7

potem wklepuję w konsoli:

qmake "INCLUDEPATH+=%main_mysql%\\include" "LIBS+=%main_mysql%\\lib" mysql.pro

Tutaj otrzymuję taki komunikat:

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

Na początku nie chciały się utworzyć pliku makefile ale przeczytałem gdzieś na jakimś forum, że można się pozbyć tego i otrzymać pliku makefile przez edycję mysql.pro . Należy zakomentować

QMAKE_USE += mysql

Tak zrobiłem. I faktycznie otrzymuję pliku makefile. Przechodząc dalej uderzam w konsoli:

mingw32-make

i tutaj pojawia się kłopot. Projekt zdaje się kompilować, ale na końcu otrzymuję coś takiego:

C:/Qt/Tools/mingw530_32/bin/../lib/gcc/i686-w64-mingw32/5.3.0/../../../../i686-w64-mingw32/bin/ld.exe: cannot find C:/PROGRA~1/MySQL/MYSQLS~1.7/lib: Permission denied
collect2.exe: error: ld returned 1 exit status
Makefile.Release:67: recipe for target '../plugins/sqldrivers/qsqlmysql.dll' failed
mingw32-make[1]: *** [../plugins/sqldrivers/qsqlmysql.dll] Error 1
mingw32-make[1]: Leaving directory 'C:/Qt/5.9.2/Src/qtbase/src/plugins/sqldrivers/mysql'
Makefile:40: recipe for target 'release-all' failed
mingw32-make: *** [release-all] Error 2

Przeglądałem jakieś wątki na ten temat i zdaje mi się, że próbowałem już sporo rzeczy. Ale zapewne gdzieś robię błąd. Zmieniłem również konstrukcję polecenia qmake na:

qmake "INCLUDEPATH+=%con_mysql%\\include" "LIBS+=%main_mysql%\\lib" mysql.pro

Ale również to samo. Zauważyłem jednak, że przy podobnych problemach w internecie ludzie nie mieli albo nie widziałem tego komunikatu:

C:/Qt/Tools/mingw530_32/bin/../lib/gcc/i686-w64-mingw32/5.3.0/../../../../i686-w64-mingw32/bin/ld.exe: cannot find C:/PROGRA~1/MySQL/MYSQLS~1.7/lib: Permission denied

Być może ten brak uprawnień czy też zabroniony dostęp jest powodem tego wszystkiego. Jednakże wchodząc w ustawienia uprawnień w windows wszystko jest na miejscu. Dałem dla aplikacji również pełną kontrolę. Odpalam konsolę również jako administrator. Patrząc przez "ls -l" w konsoli również katalogi i wszystkie podkatalogi mają pełne uprawnienia - łącznie z bitem wykonania.

Ściągnąłem sobie źródła qtbase z wersji 5.7 (obecnie używam 5.9.2) bo gdzieś przeczytałem, że z tej wersji da się to skompilować ale dalej mam ten sam problem. Spodziewałem się problemu przy samym łączeniu się z bazą, ale tutaj jest problem z sterownikiem do bazy danych.

Proszę o pomoc ale oczywiście nie chodzi mi o zrobienie czegoś za mnie. Chociaż podpowiedź czy określenie dobrej drogi postępowania - szanuję czas wszystkich. Gdzieś pewnie robię głupi błąd. Ze względu na różne próby to się troszkę w tym pogubiłem.

Z góry dziękuję i pozdrawiam

PS. Mam nadzieję, że to dobry dział - jeśli nie, to przepraszam i proszę o przeniesienie do poprawnego działu.

0

kq napisał

Wygląda jakby nie mógł odczytać dllki z program files. Spróbuj odpalić kompilację jako admin.

To znaczy odpalam konsolkę z uprawnieniami jako administrator i kompiluję - i dalej to samo. Chyba, że miałeś na myśli inny sposób.

2

Na Windowsie z tego co popatrzyłem to powinieneś:

  1. Ściągnąć paczkę https://dev.mysql.com/downloads/connector/c/
  2. Zainstalować ją
  3. Z katalogu \program files\mysql\lib\ skopiować plik libmysql.dll do folderu z projektem

Wiadomo, że jeśli posiadasz bazę nie lokalnie to należy zmienić standardowe ustawienia, takie jak adres łączenia itp. w samej bazie danych dla użytkownika.

Przykładowy kod jakim przetestowałem z pozycji windowsa:

void MainWindow::on_pushButton_clicked(){
    QString conn_name;
    {
        QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
        db.setHostName("192.168.0.4");          //jeśli lokalnie to localhost
        db.setDatabaseName("register");
        db.setUserName("user_dejf");
        db.setPassword("VeryStrongPassword");
        bool ok = db.open();
        if(ok){
            db.exec(QString("INSERT INTO users(username,pass) VALUES ('root','password')"));
            QSqlQuery ret = db.exec(QString("SELECT * from users"));
            for(int i = ret.numRowsAffected();i>0;--i){
                ret.next();
                std::cout << i << ": " << ret.value(0).toString().toStdString()
                          << "\t" << ret.value(1).toString().toStdString() << std::endl;
            }
        }
        db.close();
        conn_name = db.connectionName();
    }
    QSqlDatabase::removeDatabase(conn_name);
}
0

Działa !!!

Tak zakrzyknąłem i od razu mi ulżyło! Bardzo dziękuję za szczegółową odpowiedź wraz z przykładem. Otóż muszę jeszcze ustawić parę rzeczy po stronie bazy danych oraz połączenia, ale samo połączenie wraz z sterownikiem bazy danych działa jak najbardziej okej. Jednakże problem - przynajmniej z moich wniosków - polegał na czymś być może prozaicznym, czymś co można się było domyślić, ale ze względu na próbę kompilacji biblioteki, a nie kopiowaniu już gotowej z Connectora to, to przeoczyłem. Otóż wcześniej już tak robiłem, że brałem plik libmysql.dll z C:\Program Files\MySQL\MySQL Connector C 6.1\lib\ i kopiowałem go do folderu z projektem jednakże Qt dalej wywalał ten sam błąd. Ale teraz zgodnie z wpisem Andy Misio ściągnąłem jeszcze raz paczkę z Connectorem ale tym razem 32 bitową. Ponieważ kompilator użyty w środowisku Qt - MinGW jest u mnie 32 bitowy. I po tym zabiegu czyli instalacji paczki 32 bitowej (instalator pyta się czy chcesz upgradować paczkę i usuwa ją z folderu Program Files i instaluje w Program Files (x86) ), skopiowaniu libmysql.dll (z Program Files (x86) do folderu projektu - Qt, kompilator - bez problemu znalazł, rozpoznał sterownik do MySQL (QMYSQL) i działa prawidłowo.

Raz jeszcze dziękuję za odpowiedzi i chęć pomocy, oraz przykład poprawnego działania.
Pozdrawiam :)

PS. Edytuję wątek jeszcze aby powiedzieć, że problem z samym połączeniem i rozpoznaniem sterownika bazy jest rozwiązany, ale kompilacja sterownika bazy z źródeł Qt dalej nie działa, mimo korzystania z libmysql.dll 32-bitowej. Dlatego jakby ktoś szukał rozwiązania tego problemu to raczej nie w tym wątku, ale kłopot z połączeniem i sterownikiem jak najbardziej jest rozwiązany.

1 użytkowników online, w tym zalogowanych: 0, gości: 1