Russian Qt Forum

Qt => Базы данных => Тема начата: Deaf_Dumb_Blind от Октябрь 31, 2008, 20:08



Название: Стат. линковка приожения где юзается плагин... или альт. вариант деплоймента
Отправлено: Deaf_Dumb_Blind от Октябрь 31, 2008, 20:08
    Вообщем, мне интересно, какие есть варианты deployment'а приложения где используется плагин для sql.

    Есть 2 варианта, как вообще деплоить Qt приложение - статически слинковать и запаковать в инсталлер, либо слинковать динамически и в инсталлер запаковать так же все необходимые дллки. Но у меня, к сожалению, ничего не выходит ни тем, ни другим способом.

1) Про статическую линковку я нашел вот что:
Цитировать
Ensure that you are using a shared Qt library; you cannot use the plugins with a static build.
Но, с другой стороны, в ассистанте, я нашел совершенно другую инфу:
Цитировать
Plugins can be linked statically against your application. If you build the static version of Qt, this is the only option for including Qt's predefined plugins.

When compiled as a static library, Qt provides the following static plugins:
далее идет список плагинов, среди которого есть qsqlite и инструкция как их подключать:
вот ссылка: http://doc.trolltech.com/4.3/plugins-howto.html#static-plugins

Я делаю, все как тут написано: собираю Qt статически: "configure.exe -static", использую макрос Q_IMPORT_PLUGIN(qsqlite), в .pro файл добавляю строчку:
QTPLUGIN += qsqlite

Но при сборке, компилятро выдает ошибку "undefined reference to qt_plugin_instance_qsqlite"

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

2) При динамической линковке возникают другие проблемы.
Плагин грузится из кутешной директории... А мне надо чтобы он загрузился, скажем, из <app dir>/plugins.
Тролтеховцы предлагают 3 способа решения проблемы:
[list=1]
  • юзать стороний инсталлер, который изменит пути прописанные внутри либы
  • юзать QApplication::addLibraryPath() \ QApplication::setLibraryPaths()
  • юзать qt.conf
первый вариант мне совсем не нравится.
Пробовал заюзать второй вариант, писал в приложении:
Код
C++ (Qt)
QString path = QCoreApplication::applicationDirPath();
QApplication::addLibraryPath( path );
Это мне не помогло, при коннекте в базе QDatabase возвращал ошибку "cannot load driver"
Как использовать qt.conf я совсем не понял... Я пытался в одной папке с .exe создать файл qt.conf следущего содержания:

Код
[Paths]
Plugins = \plugins
или такого:
Код
[Paths]
Plugins = /plugins
и такого
Код
[Paths]
Plugins = ..\plugins
Ни то, ни другое, ни третье не помогло(

Подскажите, пожалуйста, что я не так делал :-[


Название: Re: Стат. линковка приожения где юзается плагин... или альт. вариант деплоймента
Отправлено: Rcus от Октябрь 31, 2008, 20:24
configure --help
Цитировать
                         turned on.
    -qt-sql-<driver> ... Enable a SQL <driver> in the Qt Library.
    -plugin-sql-<driver> Enable SQL <driver> as a plugin to be linked to at run
                         time.
                         Available values for <driver>:
                           mysql
                           psql
                           oci
                           odbc
                           tds
                           db2
 +                         sqlite
                           sqlite2
                           ibase
попробуйте при конфигурировании добавить к ключу -static еще -qt-sql-sqlite


Название: Re: Стат. линковка приожения где юзается плагин... или альт. вариант деплоймента
Отправлено: Detonator от Октябрь 31, 2008, 21:22
Цитировать
Ensure that you are using a shared Qt library; you cannot use the plugins with a static build.
Но, с другой стороны, в ассистанте, я нашел совершенно другую инфу:

Я так понял что потом новые плугины ты не сможешь подключать динамически, а все необходимые плугины ты должен сразу линковать статически. Хотя я статическую линковку сам пока не осилил, каких-то функций при линковке все равно не хватает


Название: Re: Стат. линковка приожения где юзается плагин... или альт. вариант деплоймента
Отправлено: Deaf_Dumb_Blind от Октябрь 31, 2008, 22:56
Цитировать
Ensure that you are using a shared Qt library; you cannot use the plugins with a static build.
Но, с другой стороны, в ассистанте, я нашел совершенно другую инфу:

Я так понял что потом новые плугины ты не сможешь подключать динамически, а все необходимые плугины ты должен сразу линковать статически. Хотя я статическую линковку сам пока не осилил, каких-то функций при линковке все равно не хватает

Это понятно, что при статической линковке потом будет невозможно подключать новые дллки. В этом то и весь смысл что все библиотеки собираются в 1 .exe файл.
вот из моей первой ссылочки цитата:
Цитировать
Plugins can be linked statically against your application. If you build the static version of Qt, this is the only option for including Qt's predefined plugins.

з.ы сейчас попробую собрать либу с ключем -qt-sql-sqlite


Название: Re: Стат. линковка приожения где юзается плагин... или альт. вариант деплоймента
Отправлено: DarkPhoenix от Ноябрь 01, 2008, 10:09
под виндой делаю так:
компилю проект, в каталог с exe кладу все необходимые dll, если проект с SQLite в каталоге с ехе создаю папку sqldrivers, туда кладу qsqlite4
и все работает.
линковка динамическая.


Название: Re: Стат. линковка приожения где юзается плагин... или альт. вариант деплоймента
Отправлено: Deaf_Dumb_Blind от Ноябрь 01, 2008, 10:29
попробуйте при конфигурировании добавить к ключу -static еще -qt-sql-sqlite
Спасибо, заработало )))

под виндой делаю так:
компилю проект, в каталог с exe кладу все необходимые dll, если проект с SQLite в каталоге с ехе создаю папку sqldrivers, туда кладу qsqlite4
и все работает.
линковка динамическая.
я пробовал так сделать, но у меня не получилось че-то... QSqlDatabase выдавал такой lastError() "driver not loaded".

аааааааа.. я кажись создавал такие папки ..\plugins\sqldrivers
попробую вечером без plugins


Название: Re: Стат. линковка приожения где юзается плагин... или альт. вариант деплоймента
Отправлено: DarkPhoenix от Ноябрь 01, 2008, 10:31
у меня тоже выдавало такую ошибку, пока не сделал как описал выше.
пример содержимого каталога:
file - mingwm10.dll
file - QtCore4.dll
file - QtGui4.dll
file - QtSql4.dll
file - qtWiki.exe
fldr - sqldrivers
  file - qsqlite4.dll


Название: Re: Стат. линковка приожения где юзается плагин... или альт. вариант деплоймента
Отправлено: Deaf_Dumb_Blind от Ноябрь 01, 2008, 20:39
BW, попробовал положить папку sqlplugins прямиков в папку с myApp.exe - все заработало!

Всем огромное спасибо за помощь!