При использовании собранного с использованием MXE драйвера MySQL, приложение вылетает при запуске. Это происходит из за того что QTextCodec::codecForLocale() возвращает NULL, а в коде драйвера это не предусмотрено. Почему QTextCodec::codecForLocale() возвращает NULL я ещё не разобрался, но решить проблему можно добавив в строку инициализации текстового кодека в драйвере, проверку на ноль.
Я сделал это так:
1 2 3 |
... tc(QTextCodec::codecForLocale() ? QTextCodec::codecForLocale() : QTextCodec::codecForName("UTF-8")), ... |
Для сборки драйвера понадобятся заголовочные файлы и библиотека. Я использовал MariaDB т.к. его можно скачать без регистрации, а ещё его просто получилось собрать из исходников (для статической линковки).
Вот так собираем MariaDB Connector:
1 2 3 |
cmake -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=/<Путь до MXE>/mxe/usr/i686-w64-mingw32.static/share/cmake/mxe-conf.cmake make make install |
- Может возникнуть ошибка повторного объявления ssize_t в файле include/my_global.h. Нужно открыть этот файл и закомменттировать строчку typedef SSIZE_T ssize_t;
-
Если при сборки проекта возникает ошибка multiple definition of iconv, нужно открыть файл win-iconv/win_iconv.c и переименовать в нём три функции iconv_open, iconv_close и iconv, добавив какой нибудь суффикс, например iconv_open2, iconv_close2 и iconv2. Затем переименовать эти же функции, таким же образом в файле libmariadb/my_charset.c
-
Так же что бы ваша программа в Windows XP не выдавала ошибку «Точка входа в процедуру fopen_s не найдена в библиотеке DLL msvcrt.dll» нужно в файлах libmariadb/my_fopen.c и libmariadb/dbug.c закомментировать блоки с
12#ifdef _WIN32if (fopen_s...
оставив только вариант с fopen.
Нужно слегка изменить исходники драйвера:
1 2 3 4 |
cd /<Ваш путь к исходникам>/Src/qtbase/src/plugins/sqldrivers/mysql wget http://blog.true-admin.ru/dl/qsql_mysql.patch patch -p0 < qsql_mysql.patch |
Или можно скачать мои поправленные исходники драйвера.
Примечание: Патч qsql_mysql.patch добавляет в файл qsql_mysql.pri линковку libmariadbclient.a если вы не хотите собирать MariaDB Connector из исходников, то вам нужно заменить на libmariadb.dll
Теперь собираем сам плагин:
1 2 3 |
i686-w64-mingw32.static-qmake-qt5 INCLUDEPATH+=\$\$[QT_INSTALL_PREFIX]/../include/mariadb make make install |