Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [QT4] Драйвер ibase зависит от пути компиляции


Автор: JekaZZ 22.12.2007, 21:10
Хелп!
поставил qt4.2.2 и работаю с ней в VC2005. все бы нормально, пока пытаешься запустить приложение без QT - переименовываю папку QT и приолжение не видит qsqlibased.dll, даже если он лежит рядом с exe. предполагаю, что такое будет на машине с неустановленной QT. 
Сносил QT, удалял из переменных QTDIR, удалял ветки реестра Trolltech и те, в которых встречается путь к папке qt, устанавливал qt в другую папку. Приложение все равно ищет dll в папке %QTDIR%\plugins\sqldrivers\., где %QTDIR% - папка, в которую qt была установлена сначала. 
Копилил драйвер так:
> qmake
> nmake
Единственное, где нашел ссылки на этот путь - файл QtCored4.dll, который использует приложение.
Что еще примечательно, компилировался дравер на другой машине, где qt была установлена по другому пути. Но здесь же работает в первом варианте %QTDIR%. Может путь, по которому ищется dll, берется из какого-либо кеша или из QtCored4.dll?
Что делать? можно ли скопмилировать драйвер в статическую библиотеку?

Автор: JekaZZ 22.12.2007, 22:02
Времени нет, поэтому сделал через ....то, через что обычно smile.
Нашел в файле QtCored4.dll все ссылки на папку qt в  и заменил их на .\
Драйвер положил, соответственно, в папку .\plugins\sqldrivers\

Автор: archimed7592 23.12.2007, 01:27
JekaZZ, я в своё время интересовался http://lists.trolltech.com/qt-interest/2007-08/thread00835-0.html.
В общем, суть в том, что ты всё правильно предполагал: будет работать на машине с Qt, установленной в другом месте или не установленной вообще. Если место дислокации не совпадает с прошитым в dll'ку путём, то проблемы возникают только во время разработки(в частности, с qmake). Одно из красивых решений этой проблемы - junction(правда, поможет не всегда).

Автор: JekaZZ 24.12.2007, 13:58
Новая проблема. Драйвер не грузится на машине, где нет VS. Программа не ругается ни на какие dll VC, так как таскает их с собой, но драйвер ibase не грузится. 
Причем, если стоит не 2005-я, а 6-я VS, то работает. Посмотрел зависимости qsqlibased.dll - нашел зависимоть от Msvcrtd.dll, скопировал в папку программы - не помогло. Посмотрел файловым монитором к чему обращается программа на машине, где работае и где не работает - результат одинаковый -  и там и там не находит некоторые (одни и те же файлы типа манифестов и некоторых dll) файлы. Но при этом же работает на одной!!!
Интересно обращается к qsqlibased.dll. Вот что показал монитор:
1) там, где работает:
user posted image
2) где не работает:
user posted image
user posted image

Добавлено через 10 минут и 52 секунды
 smile 
Я просто улыбаюсь со всей этой системы!
Теперь драйвер ищется не в .\plugins\sqldrivers\ , а в \.sqldrivers\ . Почему так и от чего зависит- история умалчивает

Автор: archimed7592 24.12.2007, 15:00
Цитата(JekaZZ @  24.12.2007,  13:58 Найти цитируемый пост)
Msvcrtd.dll, скопировал в папку программы - не помогло.

Поиск спасёт отца русской демократии.


Цитата(JekaZZ @  24.12.2007,  13:58 Найти цитируемый пост)
Теперь драйвер ищется не в .\plugins\sqldrivers\ , а в \.sqldrivers\ . Почему так и от чего зависит- история умалчивает 

Ну почему же. Есть определённые правила поиска плагинов Qt и, если мне не изменяет память, они очень даже хорошо документированны в assistant'е.

Автор: just_geek 23.1.2008, 14:54
решил не создавать похожую тему. Такая же проблема только с qsqlite драйвером.

Перепробовал все варианты :( не хочет на другой машине драйвер грузится и все тут.

Плагины валяются в path_to_myapp/plugins

1) копировал драйвер в папку c:\qt\4.3.3\plugins\sqldrivers\
2) устанавливал QT_PLUGIN_PATH=path_to_myapp/plugins
3) создавал qt.conf
4) QApplication::setLibraryPath
5) QApplication::addLibraryPath

На моей машине нормально работает, на другой нет... Уже не знаю, что делать.

p.s. Qt 4.3.3 Open Source Edition скомпилирована на VC++ 2008 Express Edition.
p.p.s. все переменные окружения относящиеся к qt на свой машине снес.

Автор: archimed7592 23.1.2008, 15:09
just_geek, а симптомы какие?

Цитата(JekaZZ @  24.12.2007,  13:58 Найти цитируемый пост)
Теперь драйвер ищется не в .\plugins\sqldrivers\ , а в \.sqldrivers\ . Почему так и от чего зависит- история умалчивает 

JekaZZ, если Вас до сих пор интересуют причины, то я похоже догадываюсь:
Цитата(JekaZZ @  22.12.2007,  22:02 Найти цитируемый пост)
Нашел в файле QtCored4.dll все ссылки на папку qt в  и заменил их на .\
По всей видимости в этом файле была ссылка some\path\to\qt\plugins\, который Вы заменили на .\, а не на .\plugins smile.

Автор: just_geek 23.1.2008, 15:16
Симптом: Driver not loaded

Да и список доступных драйверов пуст.

Автор: archimed7592 23.1.2008, 15:56
Недавно такая же проблема разрешилась путём вкомпилирования драйвера в Qt(т.е. компилирования НЕ плагина).
Если такое решение не устраивает, то можно попытаться выяснить в чём дело. Надеюсь, что Вы уверены, что проблема именно в драйвере(т.е. без попыток использования БД программа запускается), в таком случае качаем dependency walker и смотрим каких библиотек не хватает плагину и/или самому приложению. Плагин должен лежать в папке path_to_exe\plugins\sqldrivers. Смотреть зависимости желательно на том компьютере, на котором не запускается(я предпочитаю делать это в девственно чистой винде на виртуальной машине).

Автор: just_geek 23.1.2008, 15:59
решил проблему

в sqlite.pro надо было CONFIG -= embed_manifest_dll и пересобрать. Актуально только для VC++ 2005 и выше.

Автор: archimed7592 23.1.2008, 19:15
Ух как smile. Где рецепт вычитал?

Автор: just_geek 24.1.2008, 09:23
В ассистенте: страничка "Deploying an Application on Qt/Windows"

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)