Ошибка при использовании Qt mysql driver plugin собранный с помощью MXE

Главная »  Разработка »  Программирование »  Ошибка при использовании Qt mysql driver plugin собранный с помощью MXE

  Февраль 12, 2016, Автор: , Рубрика: Программирование, Метки: ,, ,  Нет комментариев

При использовании собранного с использованием MXE драйвера MySQL, приложение вылетает при запуске. Это происходит из за того что QTextCodec::codecForLocale() возвращает NULL, а в коде драйвера это не предусмотрено. Почему QTextCodec::codecForLocale() возвращает NULL я ещё не разобрался, но решить проблему можно добавив в строку инициализации текстового кодека в драйвере, проверку на ноль.

Я сделал это так:

Для сборки драйвера понадобятся заголовочные файлы и библиотека. Я использовал MariaDB т.к. его можно скачать без регистрации, а ещё его просто получилось собрать из исходников (для статической линковки).

Вот так собираем MariaDB Connector:

  • Может возникнуть ошибка повторного объявления 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 закомментировать блоки с

    оставив только вариант с fopen.

Нужно слегка изменить исходники драйвера:

Или можно скачать мои поправленные исходники драйвера.

Примечание: Патч qsql_mysql.patch добавляет в файл qsql_mysql.pri линковку libmariadbclient.a если вы не хотите собирать MariaDB Connector из исходников, то вам нужно заменить на libmariadb.dll

Теперь собираем сам плагин:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *