Последнее обновление:
July 3, 2020

Есть мысль... Жми, напиши!
Что имеем: Постов : 140 Авторов: 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 :

1450

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

В коробке QtCreator идёт без дров для MySQL  пичалька…

Для начала необходимо скачать MySQL http://dev.mysql.com/downloads/mysql/ ,

Обновил для MySQL 8.0 и Qt5.14 (c 5.12 не соберётся!)

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

Пришлось делать полную установку с сервером, т.к. нужных заголовочников (mysql.h) отдельно в Коннекторе нет.

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

1. Открываем консольку, необходимо добавить в системную переменную 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)

Дальше вбиваем:

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

Только пути не забудьте на свои заменить.
По идее в каталоге sqldrivers\plugins\sqldrivers должен появится файл:

qsqlmysql.dll

КЭП подсказывает, что это и есть то, что нужно.
Его нужно будет скопировать вручную в папку «Qt/5.14/mingw730_64/plugins/sqldrivers«
Или прописать «mingw32-make install -f MakeFile.release«, но могут быть проблемы с правами доступа.

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

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

Happy End.

Views :

7449

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

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

Обновил пост для Qt 5.6

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

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

ldd libqsqlmysql.so

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

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

wget http://launchpadlibrarian.net/75949497/libmysqlclient16_5.1.58-1ubuntu1_i386.deb
sudo dpkg -i ./libmysqlclient16_5.1.58-1ubuntu1_i386.deb

[64]

wget http://launchpadlibrarian.net/94808408/libmysqlclient16_5.1.58-1ubuntu5_amd64.deb
sudo dpkg -i ./libmysqlclient16_5.1.58-1ubuntu5_amd64.deb

Проверяем:

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 версии 5.5 (узнать можно в терминале командой mysql —version)
то потребуется драйвер собрать из исходников.
Запускаем консольку, вбиваем:

export QTDIR=/opt/Qt/Qt5.5.0/5.5/Src/qtbase
cd $QTDIR/src/plugins/sqldrivers/mysql
/opt/Qt/Qt5.5.0/5.5/gcc_64/bin/qmake
make
make install

Впринципе всё. Не забудьте пути заменить на свои. Qt у меня установлен в папке /opt/Qt/Qt5.5.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 :

3818