Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Разработка баз данных _ Драйвера SQL + Qt (Win32)

Автор: iddqd 26.11.2009, 12:19

Приветствую.

Имеется qt-sdk-win-opensource-2009.04 установленный на WinXP SP2.

1. Собрал (debug/release) драйвер для MySQL, получил qsqlmysqld4.dll/qsqlmysql4.dll, скопировал их к дефолтным плагинам в папку \Qt\2009.04\qt\plugins\sqldrivers\ вместе с .a файлами. По-идее этого достаточно. Собираю пример из \Qt\2009.04\qt\demos\sqlbrowser\, при запуске он ни в какую ни видит новый плагин, qsqlmysql4. Что я делаю не так?

2. Пытаюсь собрать драйвер для Oracle. Делаю по хелпу, поставил Oracle 9i Client c опцией "Programmer", добавил в oci.pro следующие строки

INCLUDEPATH+=c:\oracle9\oci\include
LIBS+=c:\oracle9\oci\lib\msvc

При сборке ругается непонятным образом:
Цитата
c:\Qt\2009.04\mingw\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\mingw32\bin\ld.exe: c:\oracle9\oci\lib\msvc: No such file: Permission denied
collect2: ld returned 1 exit status
mingw32-make[1]: *** [release\qsqloci4.dll] Error 1

Папки c:\oracle9\oci\include и c:\oracle9\oci\lib\msvc существуют, файлы в них есть.
Как решить эту проблему?

Автор: Litkevich Yuriy 26.11.2009, 14:26

iddqd, Давай разные типы драйверов в разных темах.

Да и тем про MySQL стало слишком много, http://www.forum.crossplatform.ru/index.php?act=Search&CODE=01&keywords=MySQL&namesearch=&forums=6&searchsubs=1&prune=0&prune_type=newer&sort_key=last_post&sort_order=desc&search_in=titles&result_type=topics и продолжи там

П.С.

Цитата(iddqd @ 26.11.2009, 15:19) *
No such file: Permission denied

Автор: iddqd 26.11.2009, 15:54

Про MySQL вопрос снимается, по поиску нашел решение. Выполнил следующую команду в папке c:\MySQL\lib\opt\

dlltool -k --input-def libmysql.def --dllname libmysql.dll --output-lib libmysql.a

затем собрал mysql.pro, скопировал .dll и .a в qt\plugins\sqldrivers\, а libmysql.dll в qt\bin\ (без последнего действия не заработало).

А вот с oci не получается разобраться.

Цитата
П.С.
Цитата(iddqd @ 26.11.2009, 15:19) *
No such file: Permission denied


Я тоже обратил внимание, но я уже на всю папку c:\oracle9 выставил Full control для Everyone. Ошибка осталась. Поиском пользовался, решения не нашёл.

Автор: Litkevich Yuriy 26.11.2009, 16:05

Цитата(iddqd @ 26.11.2009, 18:54) *
Я тоже обратил внимание, но я уже на всю папку c:\oracle9 выставил Full control для Everyone. Ошибка осталась. Поиском пользовался, решения не нашёл.
по Ораклу здесь решения нет, если я не ошибаюсь.

По повуду нарушения прав доступа, я думаю речь идёт о dll'ке которая, возможно, занята другим приложением (хотя dll'а должна быть доступна всем).
Нельзя ли ради теста остановит сервер и попробовать собрать драйвер заново

Автор: iddqd 26.11.2009, 16:10

Цитата(Litkevich Yuriy @ 26.11.2009, 16:05) *
Нельзя ли ради теста остановит сервер и попробовать собрать драйвер заново


Дело в том, что у меня сервер и не установлен. Я ставил только клиент, как описано в хелпе: "Choosing the option "Programmer" in the Oracle Client Installer from the Oracle Client Installation CD is sufficient to build the plugin.".

Автор: iddqd 27.11.2009, 11:20

Драйвер наконец-то собрался. А дело было в том, что я не добавил префикс -L вот тут

Цитата
LIBS+=-Lc:\oracle9\oci\lib\msvc


Добавил, драйвер собрался. Для работы ещё требуется oci.dll и вот тут возникает ещё один вопрос - мне нужно запустить программу на компе, где вообще не установлен Oracle Client. Программа запускается, но к серверу не коннектится. Failed to logon. Почему такое происходит и нужно ли что-то ещё, какие-нибудь dll'ки, для работы программы без установленного Oracle Client? На Delphi это реально сделать и оно работает, но хочется переписать программу на Qt.

Автор: Kagami 27.11.2009, 12:09

Потому что надо эту библиотеку с собой таскать. И лежать она должна в папке sqldrivers, которую надо создать рядом с экзешником.

Автор: iddqd 27.11.2009, 12:43

Ты про сам скомпиленный драйвер или про oci.dll ? Я в курсе. И то и то перетащил на другую тачку, где нет никакого оракла, запускаю программу, драйвер грузится нормально, но вот при попытке коннекта к базе получаю "Unable to logon" без дополнительных разъяснений. Цель - чтобы работало без предустановленного Оracle Client'a, а то очень не удобно получается.

Автор: Litkevich Yuriy 27.11.2009, 14:28

Я думаю, что без клиента не получится. Либо придумывать способ как его вкомпилить в свою программу, но тут могут и правовые последствия возникнуть.

Автор: iddqd 27.11.2009, 14:36

Если так, то это очень и очень плохо... А с "вкомпиливанием" вообще не вариант... Хм, на Delphi-то написали, работает без клиента. Нужели на Qt такого не получится сделать :scratch_one-s_head:

Автор: Litkevich Yuriy 27.11.2009, 14:38

iddqd, я думаю имей ты комерческую лицензию Qt троли бы тебе помогли с этим. А у Дельфей вообще нет халявной лицензии (LGPL), следовательно и сравнивать нужно с комерческой Qt.

Автор: iddqd 27.11.2009, 14:44

По большому счёту всё верно.

Посмотрим, может кто-нибудь ещё сталкивался с такой проблемой и опишут, к чему в итоге пришли.

Автор: Litkevich Yuriy 27.11.2009, 14:56

Цитата(iddqd @ 27.11.2009, 17:44) *
к чему в итоге пришли.
все приходят к одному и тому же:
Моя программа - моя программа, а её зависимости - неизбежные зависимости.

Пример - тот же Делфи, дистрибутив содержит кучу всего, но эту кучу можно установить одной программой установки.

Т.е. делаешь дистриб, который устанавливает и клиент Оракла и твою программу, ВАЖНО: для пользователя процесс установки должен быть простой, тогда ему неважно сколько dll'ок будет установлено.

Автор: iddqd 27.11.2009, 16:53

Цитата(Litkevich Yuriy @ 27.11.2009, 14:56) *
Пример - тот же Делфи, дистрибутив содержит кучу всего, но эту кучу можно установить одной программой установки.

Т.е. делаешь дистриб, который устанавливает и клиент Оракла и твою программу, ВАЖНО: для пользователя процесс установки должен быть простой, тогда ему неважно сколько dll'ок будет установлено.


В том-то и дело, нет желания делать дистрибы и ставить клиента к каждому юзеру на комп. Софт только для внутреннего использования. В Delphi моя программа компилируется в один единственный exe'шник (и работает свободно на любом компе, соединяясь с сервером в сети) и я хочу, хотя бы приближённо, сделать то же самое на Qt (я имею в виду static сборки) или согласен даже на shared сборки с набором либ кьюта, но ставить ещё и Oracle Client каждый раз - такой вариант не катит, к сожалению...

Автор: PavelDart 27.11.2009, 20:35

iddqd, а можно по-подробнее про сборку драйвера для OCI.
Жутко интересно, из каких исходников были собраны драйвера, у меня есть исходники вот http://tonyobryan.com/oracleqt/ только толку от них мало, скорее наверное, от меня.) Ещё интересно взглянуть на эти исходники. Ну и что бы сориентироваться, в правильности моих действий, приведите пожалуйста, список Ваших действий.

Автор: Litkevich Yuriy 27.11.2009, 20:45

Цитата(Гость_PavelDart_* @ 27.11.2009, 23:35) *
из каких исходников были собраны драйвера
исходники QOCI смотри в архиве Qt для всех платформ (qt-all-opensource-src-*) на FTP тролей :
ftp://ftp.trolltech.com/qt/source/

в архивах под конкретную плаформу X11 или Win их нет

Автор: PavelDart 27.11.2009, 22:54

Litkevich Yuriy, спасибо, интересно прочитать комментарии iddqd.

Автор: iddqd 29.11.2009, 20:56

Цитата(PavelDart @ 27.11.2009, 22:54) *
Litkevich Yuriy, спасибо, интересно прочитать комментарии iddqd.


В принципе всё описано в постах #1 и #6. Если по шагам, то получится примерно вот так:

1. Качаем qt-sdk-win-opensource-2009.04, ставим его, в комплекте идёт IDE Qt Creator

2.
a) Если есть CD c инсталлером Oracle, то ставим Oracle Client с диска, при установке выбираем Custom и отмечаем опцию Oracle Programmer
b) Если диска нет, но есть, например, Oracle Instant Client 10й или 11й версии, то распаковываем его в любое место и запоминаем путь

3. Открываем в Qt Creator файл путь_до_qt\2009.04\qt\src\plugins\sqldrivers\oci\oci.pro, дописываем в него две строки:

- для Oracle 9:
INCLUDEPATH+=c:\oracle9\oci\include
LIBS+=-Lc:\oracle9\oci\lib\msvc

- для Oracle InstantClient 11:
INCLUDEPATH+=c:\instantclient_11_1\sdk\include
LIBS+=-Lc:\instantclient_11_1\sdk\lib\msvc


4. Собираем проект, получаем драйвер. Копируем полученные при сборке файлы qsqloci4.dll и libqsqloci4.a для release сборки (для debug - qsqlocid4.dll и libqsqlocid4.a) в папку путь_до_qt\2009.04\qt\plugins\sqldrivers\.
Всё, драйвер собран и готов к использованию.

5. Не забываем о том, что для запуска на другом компе нам нужно скопировать в папку с нашей программой файл oci.dll (из состава самого Oracle Client'a), также создать в папке с нашей прогой папку sqldrivers и скопировать туда файл qsqloci4.dll.

Автор: PavelDart 29.11.2009, 23:59

iddqd, чего-то нового ожидать было бессмысленно. Всё равно, спасибо.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)