Автор Тема: Метод установки драйвера базы QMYSQL для qtsdk-2009.03?  (Прочитано 8639 раз)

Оффлайн PIF

  • Участник
  • *
  • Сообщений: 46
Собственно проблемка при компиляции программы использующей базу mysql.

QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QPSQL7 QPSQL
Cannot open database: QSqlError(-1, "Driver not loaded", "Driver not loaded")

Видно драйвера нет.
попытка:      apt-cache search qt mysql     дала:     libqt4-sql-mysql
                     apt-get install  libqt4-sql-mysql      результат:     уже установлен.

Также был также установлен     libmysql++-devel
для операции пересборки, которая есть на посторах инета
применительно для убунты (уж что нашёл) процедура следующая:
./configure -qt-sql-mysql -I /usr/include/mysql -L /usr/lib/mysql
make
sudo make install ну а дальше ковырять в  /usr/local/Trolltech/Qt-4.6.0/plugins/sqldrivers  библиотеку  libsqlmysql.so

Но вот адреса библиотек не совпадают, всязи с этим вопрос как решать?

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 20 159
    • Домашняя страница
Также был также установлен     libmysql++-devel
Вы что, вручную ставите, через rpm?
Нужно устанавливать пакеты через apt-get:
apt-get install libqt4-sql-mysqlТогда доустановится и libmysqlclient16. Для сборки с MySQL потребуется ещё libqt4-devel и libmysqlclient-devel.
Цитировать
для операции пересборки, которая есть на посторах инета
Что за программа? Может, она уже упакована в ALT Linux?
Андрей Черепанов (cas@)

Оффлайн PIF

  • Участник
  • *
  • Сообщений: 46
Да нет,  я не стал писать целиком ,  устанавливал aptом:
apt-get install  libmysql++-devel

Код:
apt-get install libqt4-sql-mysqlТогда доустановится и libmysqlclient16. Для сборки с MySQL потребуется ещё libqt4-devel и libmysqlclient-devel.

пробовал  apt-get install  libqt4-sql-mysql  пишет уже установлен.
пакет libqt4-devel тоже ставил ранее. А вот  libmysqlclient-devel попробую поставить вечерком.

И ещё вопрос, куда доустановиться должен бы был libmysqlclient16 (путь)?
Видел на форумах ссылаются на то, что libsqlmysql.so должен быть в QTDIR/qt/plugins/sqldrivers

пересборка имелась в виду Qt, из  QTDIR/qt посредством:
./configure -qt-sql-mysql -I /usr/include/mysql -L /usr/lib/mysql
make
sudo make install

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 20 159
    • Домашняя страница
Нет совершенно никакого смысла дублировать работу мейнтейнера. Феерические советы по расположению библиотек даже комментировать стыдно.
Андрей Черепанов (cas@)

Оффлайн PIF

  • Участник
  • *
  • Сообщений: 46
Так стоп, по-моему мы говорим на разном языке;D

Наверно необходимо начать с самого начала.
Qt устанавливался не из репозитория, а из установочного скрипта трольтеча:  qt-sdk-linux-x86_64-opensource-2009.03.1.bin
После установке в нём имеются драйвера для 3х баз, но нужной MySQL нет. И тут в игру вступает google и readme образовавшиеся после установки данного скрипта.
    итак что говорит google (например): http://www.forum.crossplatform.ru/index.php?showtopic=4068&st=0
http://www.prog.org.ru/topic_10964_0.html

    => (зы: отсюда следует), так вот отсюда  следует, что я не собираюсь обижать мейнтейнера и не собираюсь дублировать работу.
    => (зы: отсюда следует), так же отсюда  следует, что я не советую феерически  располагать библиотеки, т.к меня не интересует сборка древнего qt 4.5.2 для дистрибутива.
    => Более того вынужден признать, что вопрос не совсем по форуму, ибо он не касается дистрибутива т.к qt из репозитория, а из скрипта.
(скорее всего мне надо копать на Russian Qt Forum)
   
    Так чтоже, меня интересует, это:
    - Возможно кто-нибудь сталкивался с подобным раскладом, и знает способ реализации этой проблемы, кроме способа который говорит - ставь из репо и нет проблем.

Никого не хотел обитеть, просто удивила реакция...


Может мне поможет одна библиотека libsqlmysql.so если у кого есть просьба скинуть - весит мало, может простое копирование решит эту проблемку.
« Последнее редактирование: 15.04.2013 21:28:21 от PIF »

Оффлайн ksa

  • Модератор глобальный
  • *****
  • Сообщений: 9 049
Возможно кто-нибудь сталкивался с подобным раскладом
Видимо, это надо было вынести куда-нибудь на видное место...

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 20 159
    • Домашняя страница
Может мне поможет одна библиотека libsqlmysql.so если у кого есть просьба скинуть - весит мало, может простое копирование решит эту проблемку.
Если собираете Qt сами, то полезно будет взглянуть на спек сборки Qt в ALT Linux: http://packages.altlinux.org/en/Sisyphus/srpms/qt4/spec. В частности:
1. Нужно установить libmysqlclient-develТак как Qt линкуется со сторонней библиотекой, то необходмы заголовочные файлы. Библиотека подтянется по зависимостям.
2. При сборке указать путь к заголовочным файлам (в ./configure):
-I/usr/include/mysql/3. Если собираете не статически, а с расшаренными библиотеками, в параметрах укажите (в ./configure)
-plugin-sql-mysql4. Расположение библиотеки клиента MySQL лолжно лишь находится в путях библиотек (/usr/lib:/lib и т.п.). Впрочем, используемые библиотекой или исполняемой программой библиотеки можно посмотреть командой:
ldd <ELF-файл>
« Последнее редактирование: 15.04.2013 23:44:12 от Skull »
Андрей Черепанов (cas@)

Оффлайн PIF

  • Участник
  • *
  • Сообщений: 46
Удивительные вещи творятся товарищи!

Вообщем длительная история, но собрал таки libqsqlmysql.so (без ./configure и бубна, вернее с бубном но без ./configure)
погрузил libqsqlmysql.so в  ~QTDIR/qt/plugins/sqldrivers
и даже написал простенькую программку вывода доступных драйверов и путей поиска библиотек.
Место поиска библиотек судя по этой программе: ("/opt/qtsdk-2009.03/qt/plugins", "/home/mike/Examples from Qt 4.5/test_sql", "/usr/lib64/kde4/plugins")

но в итоге НИЧЕГО...
сбросил кеш диска и снова НИЧЕГО...
более того удивительно,  но получаю с помощью этой же программы (и компилятора) доступные драйверы: ("QSQLITE", "QPSQL7", "QPSQL")
хотя в тоже время в  ~QTDIR/qt/plugins/sqldrivers  драйверы то другие:
libqsqlite2.so  libqsqlite.so  libqsqlmysql.so  libqsqlpsql.so

 Может есть какие-нибудь идеи как такие чудеса происходят-то?

Оффлайн VadimZelenin

  • Участник
  • *
  • Сообщений: 116
    • МИС Самсон
Скорее всего ваша программа ищет плагин для mysql не там, где он расположен.
Попробуйте применить strace - он покажет, какие файлы открываются, что где ищется и т.п.

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 20 159
    • Домашняя страница
более того удивительно,  но получаю с помощью этой же программы (и компилятора) доступные драйверы: ("QSQLITE", "QPSQL7", "QPSQL")
хотя в тоже время в  ~QTDIR/qt/plugins/sqldrivers  драйверы то другие:
libqsqlite2.so  libqsqlite.so  libqsqlmysql.so  libqsqlpsql.so

 Может есть какие-нибудь идеи как такие чудеса происходят-то?
Так посмотрите, куда выкладываются драйвера из пакетов
$ rpm -ql libqt4-sql-mysql-4.8.4-alt2.M60P.1
/usr/lib64/qt4/plugins/sqldrivers/libqsqlmysql.so
Это на 64-битной архитектуре. На 32-битной будут в /usr/lib.
Андрей Черепанов (cas@)

Оффлайн PIF

  • Участник
  • *
  • Сообщений: 46
Прикреплю лог для strace ./test_sql слепленой програмки проверки библиотек/драйверов
могу её тоже выложить.

$ rpm -ql libqt4-sql-mysql-4.8.4-alt2.M60P.1
/usr/lib64/qt4/plugins/sqldrivers/libqsqlmysql.so

там и лежит, правда я такой же получил компиляцией драйвера из qtsdk, но суть не в этом а в том что это всё не видится.

Вот гляжу вывод strace и вижу что он их проходит в /opt/qtsdk-2009.03/qt/plugins
в спойлере привожу рядом libqsqlmysql.so и libqsqlpsql.so - так вот второй грузится а первый нет. Может ещё что надо дошаманить?...

Спойлер
stat("/opt/qtsdk-2009.03/qt/plugins/sqldrivers/libqsqlmysql.so", {st_mode=S_IFREG|0755, st_size=91835, ...}) = 0
stat("/opt", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat("/opt", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/opt/qtsdk-2009.03", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat("/opt/qtsdk-2009.03", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/opt/qtsdk-2009.03/qt", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat("/opt/qtsdk-2009.03/qt", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/opt/qtsdk-2009.03/qt/plugins", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat("/opt/qtsdk-2009.03/qt/plugins", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/opt/qtsdk-2009.03/qt/plugins/sqldrivers", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat("/opt/qtsdk-2009.03/qt/plugins/sqldrivers", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/opt/qtsdk-2009.03/qt/plugins/sqldrivers/libqsqlmysql.so", {st_mode=S_IFREG|0755, st_size=91835, ...}) = 0
lstat("/opt/qtsdk-2009.03/qt/plugins/sqldrivers/libqsqlmysql.so", {st_mode=S_IFREG|0755, st_size=91835, ...}) = 0
stat("/opt/qtsdk-2009.03/qt/plugins/sqldrivers/libqsqlmysql.so", {st_mode=S_IFREG|0755, st_size=91835, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=1464, ...}) = 0
stat("/opt/qtsdk-2009.03/qt/plugins/sqldrivers/libqsqlpsql.so", {st_mode=S_IFREG|0755, st_size=587727, ...}) = 0
stat("/opt", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat("/opt", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/opt/qtsdk-2009.03", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat("/opt/qtsdk-2009.03", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/opt/qtsdk-2009.03/qt", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat("/opt/qtsdk-2009.03/qt", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/opt/qtsdk-2009.03/qt/plugins", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat("/opt/qtsdk-2009.03/qt/plugins", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/opt/qtsdk-2009.03/qt/plugins/sqldrivers", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat("/opt/qtsdk-2009.03/qt/plugins/sqldrivers", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/opt/qtsdk-2009.03/qt/plugins/sqldrivers/libqsqlpsql.so", {st_mode=S_IFREG|0755, st_size=587727, ...}) = 0
lstat("/opt/qtsdk-2009.03/qt/plugins/sqldrivers/libqsqlpsql.so", {st_mode=S_IFREG|0755, st_size=587727, ...}) = 0
stat("/opt/qtsdk-2009.03/qt/plugins/sqldrivers/libqsqlpsql.so", {st_mode=S_IFREG|0755, st_size=587727, ...}) = 0

А вот и строка вывода драйверов:
Спойлер
write(2, "Find drivers:  (\"QSQLITE\", \"QPSQ"..., 47Find drivers:  ("QSQLITE", "QPSQL7", "QPSQL")
) = 47
Ответ не утешительный))

может дело в правах доступа... qtsdk-2009.03 ставился от рута, но в пользователе вроде работает во всяком случае до подключения баз работал.
« Последнее редактирование: 20.04.2013 00:41:12 от PIF »

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 20 159
    • Домашняя страница
Мне вот интересно, а зачем было собирать весь Qt?
Андрей Черепанов (cas@)

Оффлайн PIF

  • Участник
  • *
  • Сообщений: 46
А я весь и не собирал, отдельно собрал mysql, а потом добавил собранную библиотеку в установленный ранее SDK.

Кому интересно путь установки базы.

ИНСТРУКЦИЯ на Русском (хотя в начале юзал с оф. сайта http://qt-project.org/doc/qt-5.0/qtsql/sql-driver.html): http://doc.crossplatform.ru/qt/4.7.x/sql-driver.html

1. Получение путей установки заголовочных файлов и библиотек mysql
    rpm -ql libmysqlclient-devel >> ~/list_libmysqlclient-devel
Спойлер
/usr/include/mysql
/usr/include/mysql/decimal.h
/usr/include/mysql/errmsg.h
/usr/include/mysql/keycache.h
/usr/include/mysql/m_ctype.h
/usr/include/mysql/m_string.h
/usr/include/mysql/my_alloc.h
/usr/include/mysql/my_attribute.h
/usr/include/mysql/my_compiler.h
/usr/include/mysql/my_config.h
/usr/include/mysql/my_dbug.h
/usr/include/mysql/my_dir.h
/usr/include/mysql/my_getopt.h
/usr/include/mysql/my_global.h
/usr/include/mysql/my_list.h
/usr/include/mysql/my_net.h
/usr/include/mysql/my_no_pthread.h
/usr/include/mysql/my_pthread.h
/usr/include/mysql/my_sys.h
/usr/include/mysql/my_xml.h
/usr/include/mysql/mysql.h
/usr/include/mysql/mysql_com.h
/usr/include/mysql/mysql_embed.h
/usr/include/mysql/mysql_time.h
/usr/include/mysql/mysql_version.h
/usr/include/mysql/mysqld_ername.h
/usr/include/mysql/mysqld_error.h
/usr/include/mysql/plugin.h
/usr/include/mysql/sql_common.h
/usr/include/mysql/sql_state.h
/usr/include/mysql/sslopt-case.h
/usr/include/mysql/sslopt-longopts.h
/usr/include/mysql/sslopt-vars.h
/usr/include/mysql/typelib.h
/usr/lib64/libmysqlclient.so
/usr/lib64/libmysqlclient_r.so
/usr/share/aclocal/mysql.m4
Запоминаем заголовочные файлы лежат: /usr/include/mysql/
библиотеки: /usr/lib64/ 
    Особое внимание к libmysqlclient_r.so (далее мы её ещё заметим как -lmysqlclient_r)
2. Т.к ставил от рута, то:
    su -
3. Идём к месторасположению mysql для сборки библиотеки
    # cd /opt/qtsdk-2009.03/qt/src/plugins/sqldrivers/mysql/
4. Смотрим содержимое
    #ls
Спойлер
main.cpp  mysql.pro  README
ридми как раз предупреждает о необходимости иметь заголовочные файлы с библиотеками см. выше.
5. Собираем   
    qmake-qt4 "INCLUDEPATH+=/usr/include/mysql" "LIBS+=-L/usr/lib64 -lmysqlclient_r" mysql.pro
6. Компилируем
    #make
Спойлер
g++ -c -pipe -O2 -fvisibility=hidden -fvisibility-inlines-hidden -D_REENTRANT -Wall -W -fPIC -DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_ASCII -DQT_NO_DEBUG -DQT_PLUGIN -DQT_SQL_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtSql -I/usr/include/qt4 -I/usr/include/mysql -I. -o main.o main.cpp
/usr/lib64/qt4/bin/moc -DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_ASCII -DQT_NO_DEBUG -DQT_PLUGIN -DQT_SQL_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtSql -I/usr/include/qt4 -I/usr/include/mysql -I. ../../../sql/drivers/mysql/qsql_mysql.cpp -o qsql_mysql.moc
g++ -c -pipe -O2 -fvisibility=hidden -fvisibility-inlines-hidden -D_REENTRANT -Wall -W -fPIC -DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_ASCII -DQT_NO_DEBUG -DQT_PLUGIN -DQT_SQL_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtSql -I/usr/include/qt4 -I/usr/include/mysql -I. -o qsql_mysql.o ../../../sql/drivers/mysql/qsql_mysql.cpp
/usr/lib64/qt4/bin/moc -DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_ASCII -DQT_NO_DEBUG -DQT_PLUGIN -DQT_SQL_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtSql -I/usr/include/qt4 -I/usr/include/mysql -I. ../../../sql/drivers/mysql/qsql_mysql.h -o moc_qsql_mysql.cpp
g++ -c -pipe -O2 -fvisibility=hidden -fvisibility-inlines-hidden -D_REENTRANT -Wall -W -fPIC -DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_ASCII -DQT_NO_DEBUG -DQT_PLUGIN -DQT_SQL_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtSql -I/usr/include/qt4 -I/usr/include/mysql -I. -o moc_qsql_mysql.o moc_qsql_mysql.cpp
rm -f libqsqlmysql.so
g++ -Wl,-O1 -shared -o libqsqlmysql.so main.o qsql_mysql.o moc_qsql_mysql.o   -L/usr/lib64 -L/usr/lib64 -lmysqlclient_r -lQtSql -L/usr/X11R6/lib64 -lQtCore -lpthread 
7. Устанавливаем
    #make install
Спойлер
install -m 755 -p "libqsqlmysql.so" "/usr/lib64/qt4/plugins/sqldrivers/libqsqlmysql.so"
Путь как раз где должена лежать библиотека пакета libqt4-sql-mysql-4.8.4-alt2.M60P.1
После компиляции libqsqlmysql.so - также будет лежать и в /opt/qtsdk-2009.03/qt/src/plugins/sqldrivers/mysql/
8. Делаем ссылку на библиотеку в плагинах для того чтобы Qt всё хозяйство увидел. (ЧЕГО ОН ТАК И НЕ СДЕЛАЛ - ПОВТОРЮСЬ)
    ln -s /usr/lib64/qt4/plugins/sqldrivers/libqsqlmysql.so /opt/qtsdk-2009.03/qt/plugins/sqldrivers/
9. Ребутимся и радуемся жизни, так всё должно было завершится - но нет...
10. Ввидел жалобы для хрюши по отчистки кэша, проделал в с дисковым кэшем
  su-
  #sync
  #echo 3 > /proc/sys/vm/drop_caches

 
 но это не помогло.
 

Теперь думаю поставить не sdk, скомпилировать из сырцов qt-x11-opensource-src-4.5.2.tar.gz с поддержкой нужных баз посмотрю что выдет.

А потом можно продолжить и с этим возится. 
« Последнее редактирование: 21.04.2013 00:20:55 от PIF »

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 361
  • Учиться .... Телепатами не рождаются, ими ....
Цитировать
Ввидел жалобы для хрюши по отчистки кэша
перевидите  на русский

Что у вас не получилось?
Может вам нужно что-то типа ldconfig ?

Оффлайн PIF

  • Участник
  • *
  • Сообщений: 46
Извиняюсь за сленг хрюша - Win ХР и иже с ним.

Вот например http://blog.adtl.cz/2009/09/05/qt-mysql-windows/ есть совет для виндов почистить кэш.
Спойлер
Теоретически к каталоге %QTDIR%\qt\plugins\sdldrivers\ должны появится два файла
qsqlmysql4.dll
qsqlmysql4d.dll

Это собствеено наши плагины.

Возможно, что после этого ваша программа все равно не заработает при запуске из под QtCreator'a.

Причина также может заключаться в том, что Qt кеширует данные о загрузке плагинов. То есть, если Qt один раз не смогла загрузить плагин, то потом даже не пробует. Чтобы очистить кеш в Windows, необходимо в регистре удалить ненужные записи в ключах HKEY_CURRENT_USER\Software\Trolltech\OrganizationDefaults\Qt Plugin Cache 4.5.debug
HKEY_CURRENT_USER\Software\Trolltech\OrganizationDefaults\Qt Plugin Cache 4.5.false

Возможно, здесь нужно сделать что-то подобное.

Может вам нужно что-то типа ldconfig ?

Возможно, только как? Рад буду выслушать любые предложения. Т.к уже долго возился с этим вопросом и как-то никак пока.