Последнее обновление:
May 24, 2021

Есть мысль... Жми, напиши!
Что имеем: Постов : 142 Авторов: 1 Категорий: 22

Android MySql (QMysql) драйвер для Qt5.6 на Windows и Linux компиляция

В общем понадобилось портировать одну прогу под Андроид arm7, но она плотненько работает с базой данных, а так как я человек впринципе ленивый, то обёртку для REST API сервера было лень писать, решился на компилирование MySQL плагина, но если бы я знал тогда, что это займёт у меня 20 часов…
красноглазик

 

В общем вот вам готовый рецепт из 12 шагов для компиляции на Ubuntu и на Windows
То, что помечено windows16 -выполнять только на винде.
Установим инструменты:
1. Качаем и устанавливаем CMake https://cmake.org/download/ у меня 3.5.2
2. Разумеется Android NDK у вас уже должен быть установлен, но вдруг: https://developer.android.com/tools/sdk/ndk/index.html
windows163. Качаем и ставим MSYS https://sourceforge.net/projects/mingw/files/latest/download?source=files (отмечаем всё, что можно)
4. При установке Qt нужно было поставить и исходники (папка qt/5.6/src/qtbase), если нет её, то качаем и ставим
windows165. Открываем консольку MSYS (c:\mingw\msys\1.0\msys.bat), в дальнейшем все действия будут вестись в ней и для удобства выкачивания установим wget:

/c/mingw/bin/mingw-get install msys-wget-bin

1. Создадим отдельную директорию, где будем развлекаться и перейдём в неё:

mkdir /d/Projects/AndroidMySQL
 cd /d/Projects/AndroidMySQL

2. Выкачиваем саму MariaDB, а именно коннектор

wget https://downloads.mariadb.org/interstitial/connector-c-3.0.0/mariadb-connector-c-3.0.0-alpha-src.tar.gz
 tar -xzvf mariadb-connector-c-3.0.0-alpha-src.tar.gz

3. Выкачиваем и распаковываем исходники iconv http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz

wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
 tar -xvzf libiconv-1.14.tar.gz

4. Выкачиваем и распаковываем OpenSSL

wget -c http://www.openssl.org/source/openssl-1.0.1h.tar.gz --no-check-certificate
 tar -xvzf openssl-1.0.1h.tar.gz

5. Задаём общие глобальные переменные
windows16

 export PATH="$PATH:/c/mingw/bin:/c/Program Files (x86)/CMake/bin"
 export ANDROID_NDK_ROOT=/d/Android/android-ndk-r10e
 export SR="$ANDROID_NDK_ROOT"/platforms/android-19/arch-arm/usr # Укажите платформу, под которую собираете ваши проекты (Лучше, 19)
 export BR="$ANDROID_NDK_ROOT"/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/bin/arm-linux-androideabi-
 export CPP="$BR"cpp
 export AR="$BR"ar
 export STRIP="$BR"strip
 export RANLIB="$BR"ranlib
 export LINKER="$BR"ld
 export OBJDUMP="$BR"objdump
 export CC="$BR"gcc
 export CFLAGS="--sysroot=$SR"
 export CPPFLAGS="$CFLAGS"
 export C_INCLUDE_PATH=$SR/include
 export ANDROID_DEV=$SR/usr
 export MAKEDEPPROG="$CC -M"

6. Собираем сначала iconv

cd libiconv-1.14
 ./configure --host=arm --prefix=$SR/usr --with-sysroot=$SR
 make
 make install

7. Собираем OpenSSL

cd ../openssl-1.0.1h
 CC="$CC -march=armv7-a -mfloat-abi=softfp"
 ./Configure android-armv7 --prefix=$SR/usr no-asm
 make
 make install
 make install_sw
Если заматериться error: undefined reference to ‘__ctype_get_mb_cur_max’,
то в файл libcharset/lib/localcharset.c после дефайнов добавляем

size_t __ctype_get_mb_cur_max(void){
 return 1;
 }

8. Нус, начинаем подготовку к сборке MariaDB

В файл include/my_global.h необходимо добавить определение типа ushort

#ifndef ushort
 #define ushort uint16
 #endif

9. Подготавливаем сборку

cd ../mariadb-connector-c-3.0.0-alpha-src
mkdir build
 cd build
cmake -G "Unix Makefiles"
 -DCMAKE_BUILD_TYPE=Release \
 -DCMAKE_AR="$BR"ar.exe \
 -DCMAKE_C_COMPILER="$BR"gcc.exe \
 -DCMAKE_C_FLAGS=--sysroot=$SR \
 -DCMAKE_LINKER="$BR"ld.exe \
 -DCMAKE_RANLIB="$BR"ranlib.exe \
 -DCMAKE_STRIP="$BR"strip.exe \
 -DCMAKE_SYSTEM_NAME=Linux \
 -DICONV_INCLUDE_DIR="$SR/usr/include" \
 -DICONV_LIBRARIES="$SR/usr/lib/libiconv.a" \
 -DOPENSSL_ROOT_DIR="$SR/usr/lib/" \
 ../

10. Зажмуриваемся и собираем

make
windows16 ага, фиг то там, failed to create symbolic link ‘libmysqlclient.a’: No error
внезапно… тут, похоже, баг самого CMake, поэтому в файле
\AndroidMySQL\mariadb-connector-c-3.0.0-alpha-src\build\libmariadb\CMakeFiles\SYM_libmysqlclient.a.dir\build.make
находим строки (их по две) c -E create_symlink libmariadbclient.a libmysqlclient.a, удаляем её полностью
а так же -E create_symlink libmariadb.so libmysqlclient_r.so аналогично
и вручную копируем и продолжаем сборку

cp libmariadb/libmariadbclient.a libmariadb/libmysqlclient.a
 cp libmariadb/libmariadbclient.a libmariadb/libmysqlclient_r.a
 cp libmariadb/libmariadb.so libmariadb/libmysqlclient.so
 cp libmariadb/libmariadb.so libmariadb/libmysqlclient_r.so
 make
и ещё раз фиг error: unknown type name ‘pthread_mutex_t’
в файле ../unittest/libmariadb/thread.c
находим pthread_t threads[THREAD_NUM]; заменяем на void * threads[THREAD_NUM];
и там же заменяем pthread_mutex_t LOCK_test; на void * LOCK_test;
и опять
make

На этот раз должно всё ок пройти, ну и устанавливаем и копируем к нашему ndk

make install
mkdir "$SR/usr/lib/mariadb"
 mkdir "$SR/usr/include/mariadb/"
 cp libmariadb/*.{a,so} "$SR/usr/lib/mariadb/"
 cp ../include/* "$SR/usr/include/mariadb/"

11. Собираем плагин QMySQL, открываем обычную консольку пути только на свои замените

cd /d/Qt/5.6/Src/qtbase/src/plugins/sqldrivers/mysql/
 /d/Qt/5.6/android_armv7/bin/qmake.exe \
 "INCLUDEPATH+=$SR/usr/include/mariadb" \
 "LIBS+=-L$SR/usr/lib/mariadb -lmariadbclient -lssl -lcrypto -liconv" \
 -o Makefile mysql.pro
make
 make install

12. Разрабатываем тестовый проект
Так как зависит от libmariadb.so, то его необходимо таскать с проектом, для этого в *.pro файле проекта добавить

contains(ANDROID_TARGET_ARCH,armeabi-v7a) {
 ANDROID_EXTRA_LIBS = \
 d:/Projects/AndroidMySQL/mariadb-connector-c-3.0.0-alpha-src/build/libmariadb/libmariadb.so
 }

Пересобираем проект, запускаем, и хуй то там =)
QMYSQL driver not loaded
яоминь
Посмотрим зависимости libqsqlmysql.so, которая в каталоге /home/pavelk/Qt/5.6/android_armv7/plugins/sqldrivers

ldd libqsqlmysql.so

и опять облом, нужна ldd для arm, ладно и с этим разберёмся, например так, тынц.

ldd-avr libqsqlmysql.so

Дело в том, что в зависимостях у libmysql.so есть libmariadb.so.3, а не libmariadb.so
почуяли разницу? =))

В общем, что бы побыстроляну пофиксить
в файле libmariadb/CMakeLists.txt
находим

SOVERSION ${CPACK_PACKAGE_VERSION_MAJOR})

и заменяем на

SOVERSION "so")

ну а дальше удалить полностью build и заново, начиная с 9 шага
troll

!пересобираем! проект, не забыть исправить в pro файле на libmariadb.so.so запускаем и радуемся =)

Итого: сэкономлено куча времени и нервов. Хоть спасибо скажите =))

Views :

1692

Компиляция MySQL 8.0 для Qt5/Qt6 на Windows (x32/x64)

В коробке QtCreator идёт без дров для MySQL  пичалька…
Почему? Из-за несовместимости лицензий. Но мы можем их скомпилировать самостоятельно!

Для начала необходимо скачать MySQL

Обновил для MySQL 8.0 и Qt 5.14 (c 5.12 не соберётся!)
Добавил для MySQL 8.0 / Maria DB и Qt 6.2

Важно: MysqlServer есть только под x64 архитектуру, поэтому Ваши проекты так же должны собираться компилятором под x64, поэтому не забудьте доставить MinGW x64 с помощью MaintenanceTool.exe из папки с Qt.
Так же при установке Qt нужно, что бы была отмечена установка исходников! Если устанавливали без Sources, то через MaintenanceTool.exe можете доставить.
Только обязательно той же версии!

0. Нужно скачать заголовочные файлы MySQL.

Страница загрузки: http://dev.mysql.com/downloads/mysql/

Для установки полной версии всего установщик назывался: «mysql-installer-community-8.0.25.0.msi«
Для установки только заголовочных и необходимым библиотек отметил следующее (в коннекторе заголовочных mysql.h нет):

ЛИБО качать готовый архив со всеми нужными файлами, называется «mysql-8.0.25-winx64.zip» после скачивания распаковываете куда-нить.

Дальше всё должно быть просто:

1. Открываем консольку (cmd) и не закрываем пока не закончим. Необходимо добавить в системную переменную Path пути к Qt (только замените на свои):

set PATH=C:\Qt\5.4\mingw491_32\bin;%PATH% (Там, где лежит qmake.exe)
set PATH=C:\Qt\Tools\mingw491_32\bin;%PATH% (там, где лежит mingw32-make.exe)

ВАЖНО!
Убедитесь, что в PATH у Вас нет никаких путей до других версий Qt и компиляторов, а то будет куча непонятных ошибок. Можно в консольке ввести echo %PATH% и посмотреть, что сейчас там.
Так же важно, что бы версия MinGW совпадала с той, что стоит в комплекте из параметров QtCreator:

И что бы именно этот комплект использовался при сборке Ваших приложений. Пути можно подсмотреть на вкладке «Профили Qt» и «Компиляторы»

Для Qt 5.x

cd C:\Qt\5.14\Src\qtbase\src\plugins\sqldrivers\mysql
qmake.exe -o MakeFile "INCLUDEPATH+=\"C:/Program Files/MySQL/MySQL Server 8.0/include\"" "LIBS+=\"C:/Program Files/MySQL/MySQL Server 8.0/lib/libmysql.lib\"" "LIBS+=-L\"C:/Program Files/MySQL/MySQL Server 8.0/lib"" mysql.pro
mingw32-make -f MakeFile.release
Если будет ругаться «Cannot read qtsqldrivers-config.pri»,
то в файле «qsqldriverbase.pri», который в диектории уровнем выше,
закомментируйте:
#include($$shadowed($$PWD)/qtsqldrivers-config.pri)
Когда ругнётся на «Project ERROR: Library mysql is not defined»,
то в «mysql.pro» закомментируйте:
#QMAKE_USE += mysql

Только пути не забудьте на свои поменять.
И особое внимание к расстановке и направлению слэшей!

Для Qt 6.x
MySQL беру из скачанного архива.

ВАЖНО!
В PATH должен быть так же прописан путь до CMake.exe!
Его можно установить из Qt «MaintanceTool.exe«.
Если в PATH их будет несколько (если кто-либо ещё какие-либо пути в PATH вносил, где есть cmake.exe) может быть множество непонятных ошибок. Так же должен болтаться в PATH и сборщик Ninja.
Важно, что бы разрядность совпадала!

set PATH=E:/Qt/Tools/CMake_64/bin;%PATH%
set PATH=E:/Qt/Tools/Ninja;%PATH%

Ладно, собираем:

E:
cd E:\Qt\6.2.0\Src\qtbase\src\plugins\sqldrivers
mkdir build-sqldrivers
cd build-sqldrivers
set toolchain_path=E:/Qt/6.2.0/mingw81_64/lib/cmake/Qt6/qt.toolchain.cmake
cmake -G"Ninja" ../ -DMySQL_INCLUDE_DIR="D:/Projects/MysQL/include" -DMySQL_LIBRARY="D:/Projects/MySQL/lib/libmysql.lib" -DCMAKE_TOOLCHAIN_FILE="%toolchain_path%"
cmake --build .

Только пути не забудьте на свои заменить.
И особое внимание к расстановке и направлению слэшей!

Допустим, сборка успешно закончилась.

По идее в каталоге sqldrivers\plugins\sqldrivers должен появится файл:

qsqlmysql.dll

КЭП подсказывает, что это и есть то, что нужно (релизная версия).
Его нужно будет скопировать вручную в папку «Qt/5.14/mingw730_64/plugins/sqldrivers«

Если когда после запуска приложения в выхлопе будет:

warning unknown: QSqlDatabase: QMYSQL driver not loaded
warning unknown: QSqlDatabase: available drivers: QMYSQL

Надо бы скопировать  libmySQL.dll, libssl-1_1-x64.dll и libcrypto-1_1-x64.dll  (из папки C:/Program Files/MySQL/MySQL Server 8.0/lib или из папки с распакованным архивом из подпапок lib и bin) в папку C:/windows, либо таскать рядом с exe`шником будущей программы, либо добавить глобально путь в PATH, либо же их можно бросить туда же, куда и qsqlmysql.dll.

Если всё равно что-то не то, то качаете http://dependencywalker.com,
натравливаете его на dll файл или программу в целом и смотрите, какие зависимости ей нужны.

Официальное руководство по компиляции для Qt 6.x: https://doc.qt.io/qt-6/sql-driver.html

Должно быть всё ок.

Happy End.

Views :

9114

Ubuntu Qt 5.6 mysql 5.6 драйвер не найден, но доступен (driver not loaded)

Собственно ошибка: SqlDatabase: QMYSQL driver not loaded

Обновил пост для Qt 5.14 и MySQL 8.0

Для Qt 5 и выше обычно mysql драйвер уже идёт в стандартной поставке.
Для уточнения переходим в каталог установки Qt а далее в папку с драйверами, у меня это /opt/Qt/Qt5.14.0/5.14.0/gcc_64/plugins/sqldrivers
по идее там должен быть libqsqlmysql.so

Если он там есть,  может быть, что не найдена какая-либо зависимость для libqsqlmysql.so
проверять так:

ldd libqsqlmysql.so

скорее всего будет не найдена (not found) зависимость libmysqlclient_r.so.21

Можно, конечно, только его и поставить, вот так:
[32]

[64]

Проверяем:

ldd libqsqlmysql.so
Может быть так же не доступны быть:
libssl.so.10 и libcrypto.so.10
Ставить их так:
sudo apt-get update
sudo apt-get install libssl1.0.0 libssl-dev
cd /lib/x86_64-linux-gnu
sudo ln -s libssl.so.1.0.0 libssl.so.10
sudo ln -s libcrypto.so.1.0.0 libcrypto.so.10

Впринципе, можно на этом остановиться,
но я решил использовать более новый, поэтому придётся пересобрать.

У меня стоит MySQL версии 8.0 (узнать можно в терминале командой mysql —version)
поэтому потребуется драйвер собрать из исходников.
Запускаем консольку, вбиваем:

export QTDIR=/opt/Qt/Qt5.14.0/5.14.0/Src/qtbase
cd $QTDIR/src/plugins/sqldrivers
/opt/Qt/Qt5.14.0/5.14.0/gcc_64/bin/qmake   -- MYSQL_INCDIR=/usr/include/mysql   MYSQL_LIBDIR=/usr/lib/mysql
make sub-mysql
make install

Важно: что бы было можно пересобрать из исходников, он должны быть установлены! Если при установке Qt не отметили, то доустановить можно через MaintenanceTool, который в корне папки с Qt. Устанавливаете именно той версии, которая используется в комплекте QtCreator`а

Кстати, заголовочные файлы клиента mysql так же должны быть установлены!
Как это делать в вашем дистрибутиве должно легко гуглиться.

Установка MySQL 8.0 На Ubuntu 18.04:

wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.11-1_all.deb
sudo dpkg -i mysql-apt-config_0.8.11-1_all.deb  #Выбираем 8 версию
sudo apt-get update
sudo apt-get install mysql-server mysql-client mysql-connector-odbc libmysqlclient-dev
Если при update будет ругаться, что ключ истёк, то обновить:
sudo apt-key adv —keyserver keys.gnupg.net —recv-keys 8C718D3B5072E1F5

Впринципе всё. Не забудьте пути заменить на свои. Qt у меня установлен в папке /opt/Qt/Qt5.14.0/.

Немного как подключится к базе MySQL из Qt
В проекте в файл *.pro   дабавить

QT+= sql

Ну а  потом в  классе прописать

#include <QSqlDatabase>
#include <QSqlError>
#include <QDebug>

Ну и подключаемся:

QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "mydb");
db.setHostName("localhost");
db.setDatabaseName("WORKYS");
db.setUserName("root");
db.setPassword("12345");
bool ok = db.open();
qDebug()<< ((ok)? "DATABASE OPENED!!!!" : "DATABASE NOT OPENED" + db.lastError().text() );

Вот как то так =)

Views :

3939