Russian Qt Forum

Программирование => С/C++ => Тема начата: Crazy Sage от Июнь 16, 2009, 14:45



Название: Использование libpq.dll (PostgreSQL API) в Borland С++ Builder
Отправлено: Crazy Sage от Июнь 16, 2009, 14:45
Такой вопрос, пытаюсь использовать постгресовскую библиотеку в С++ проекте созданном в борланд билдере.
С помощью implib делаю из .dll .lib, добавляю его в проект, в свои файлы подключаю libpq-fe.h в котором сигнатуры всех функций библиотеки
Dll лежит в каталоге куда все компилируется
На этапе линковки на каждую функцию из этой библиотеки получаю
unresolved extern <имя функции> referenced in <obj файл>
В чем моя ошибка? (с dll раньше не работал, может еще отдельно в проекте саму dll надо указать, помимо .lib и ,h)
Борланд 6й версии


Название: Re: Использование libpq.dll (PostgreSQL API) в Borland С++ Builder
Отправлено: kuzulis от Июнь 16, 2009, 15:00
Цитировать
С помощью implib делаю из .dll .lib, добавляю его в проект, в свои файлы подключаю libpq-fe.h в котором сигнатуры всех функций библиотеки
А разве так можно из динамической библиотеки сделать статическую? о_О

Цитировать
В чем моя ошибка? (с dll раньше не работал, может еще отдельно в проекте саму dll надо указать, помимо .lib и ,h)

ну без преобразования может нужно попробовать подключить библиотеку через QLibrary ? (если она динамическая :) )


Название: Re: Использование libpq.dll (PostgreSQL API) в Borland С++ Builder
Отправлено: kuzulis от Июнь 16, 2009, 15:14
хотя, зачем что-то "левое" использовать, если в QT4 есть поддержка PostgreSQL


Название: Re: Использование libpq.dll (PostgreSQL API) в Borland С++ Builder
Отправлено: BRE от Июнь 16, 2009, 15:21
хотя, зачем что-то "левое" использовать, если в QT4 есть поддержка PostgreSQL
Я так понял, разговор не про Qt идет... Тема-то в разделе C++.

2 Crazy Sage
Так а ты указаваешь, что бы .lib линковался с проектом или только .h файлы в свои файлы подключаешь?


Название: Re: Использование libpq.dll (PostgreSQL API) в Borland С++ Builder
Отправлено: kuzulis от Июнь 16, 2009, 15:53
Упс! :)

Тада нужно использовать WinAPI для подгрузки библиотеки :)

в гугле написать : "использование dll в Builder / Delphi "


Название: Re: Использование libpq.dll (PostgreSQL API) в Borland С++ Builder
Отправлено: kuzulis от Июнь 16, 2009, 15:56
или сходить на сайт M$ .. например сюда : http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspx


Название: Re: Использование libpq.dll (PostgreSQL API) в Borland С++ Builder
Отправлено: BRE от Июнь 16, 2009, 16:17
Упс! :)

Тада нужно использовать WinAPI для подгрузки библиотеки :)

в гугле написать : "использование dll в Builder / Delphi "
:)
kuzulis, а у тебя Qt как собрана, в виде динамической библиотеки?
А ты ее в main() подгружаешь, что бы использовать ее функционал?
 ;)

Вот Crazy Sage тоже не хочет libpq руками подгружать.  :)


Название: Re: Использование libpq.dll (PostgreSQL API) в Borland С++ Builder
Отправлено: Crazy Sage от Июнь 16, 2009, 19:05
Я делаю проект->добавить файл и добавляю .lib файл
Полагаю, что это и есть указание, чтобы он линковался с проектом.
Просто у меня весь опыт программирования до сих пор под Linux в KDeveloper'е, поэтому с виндовскими библиотеками я пока просто плаваю.
Если не разберусь буду конечно подключать библиотеку и выдирать адреса по одной функции, но очень не хочется


Название: Re: Использование libpq.dll (PostgreSQL API) в Borland С++ Builder
Отправлено: kuzulis от Июнь 16, 2009, 19:43
Цитировать
kuzulis, а у тебя Qt как собрана, в виде динамической библиотеки?
ДА!
Код:
А ты ее в main() подгружаешь, что бы использовать ее функционал?
тут автоматом компилятор (или хез что) все что нужно подгружает! :)


Название: Re: Использование libpq.dll (PostgreSQL API) в Borland С++ Builder
Отправлено: kuzulis от Июнь 16, 2009, 19:52
Цитировать
Если не разберусь буду конечно подключать библиотеку и выдирать адреса по одной функции, но очень не хочется
Дык есть такие термины как "статическая загрузка динамической библиотеки" и "динамическая загрузка динамической библиотеки"
это НЕ линковка! Разница в том , что при статической загрузке - она грузится вся при старте приложения.. и если её (библиотеки) вдруг не оказалось в путях её поиска - то приложение завершится с ошибкой.. а если динамически грузить - то там в нужный момент идет подгрузка и выгрузка!!!

Но это все относится к ДИНАМИЧЕСКИМ библиотекам ( ИМХО в силу моей осведомленности) :)

А статическая линковка работает ТОЛЬКО для статических библиотек!!!  :) И код библы прилинковывается в исполняемый файл приложения!

И я первый раз слышу - что можно преобразовать динамическую библиотеку в ситатическую !! О_о Это невозможно! :) Не верю!

А как я понимаю - постгресс. dll - есть ДИНАМИЧЕСКАЯ БИБЛИОТЕКА - и значит работать с ней нужно как с ДИНАМИЧЕСКОЙ!

2 Crazy Sage , ты поройся в гугле все-таки.. для дельфей/билдера - есть много примеров как грузить динамическую библу! :) .. и моё ИМХО - не стоит её конвертить в *.lib



Название: Re: Использование libpq.dll (PostgreSQL API) в Borland С++ Builder
Отправлено: Crazy Sage от Июнь 16, 2009, 19:55
Насколько я понимаю, .lib в данной ситуации является библиотекой-заглушкой, которая автоматически подключает и вытаскивает все функции из .dll-ки


Название: Re: Использование libpq.dll (PostgreSQL API) в Borland С++ Builder
Отправлено: kuzulis от Июнь 16, 2009, 20:06
Зачем?

Статически (неявно) грузиш свою *.dll и все!!!
вот пример кода неявной загрузки на делфях .. (думаю в билдере разницы не много будет)
Код:
...
var
...
function IsValidlnt(AText: String): Boolean; external 'DataCheck.dll'; 
function IsValidDate(AText: String): Boolean; external 'DataCheck.dll';
...
:) проще нет ничо!


Название: Re: Использование libpq.dll (PostgreSQL API) в Borland С++ Builder
Отправлено: Crazy Sage от Июнь 16, 2009, 20:08
Единственный имеющийся у меня пример на C++ посложнее, там на каждую функцию пишется по 3-4-5 строчек.


Название: Re: Использование libpq.dll (PostgreSQL API) в Borland С++ Builder
Отправлено: Rcus от Июнь 16, 2009, 20:23
Это все интересно, но, кажется, безсполезно. В дистрибутиве постгреса есть мейкфайл для сборки libpq при помощи bcc в любом виде.


Название: Re: Использование libpq.dll (PostgreSQL API) в Borland С++ Builder
Отправлено: Crazy Sage от Июнь 16, 2009, 20:26
Ну есть, собирает он собственно те же самые .lib и .dll
Впрочем у меня и их не собирает, ругается на то, что я ему не передаю ключ -N (который я ему передаю)


Название: Re: Использование libpq.dll (PostgreSQL API) в Borland С++ Builder
Отправлено: Rcus от Июнь 16, 2009, 20:31
Блин, надоело гадать. Давайте файл проекта и полный вывод компилятора.


Название: Re: Использование libpq.dll (PostgreSQL API) в Borland С++ Builder
Отправлено: kuzulis от Июнь 16, 2009, 20:43
2 Crazy Sage,

в общем так.. у тебя имеется :  libpq.dll  и libpq-fe.h  в котором описаны прототипы ф-ций, имеющихся в дллке..
теперь делаешь так:
1. чтобы проверить, действительно ли они в ней есть - в тоталкоммандере выделяеш свою дллку и жмакаеш F3 - запустится плагин тотала и в нем ты увидиш все имена экспортируемых (расшаренных) в дллке функций.
2. создаешь какой нить свой заголовочный файл myheader.h в котором описываешь НУЖНЫЕ ТЕБЕ функции.. чтобы  узнать как они выглядят - смотриш прилагаемый заголовочник libpq-fe.h  и выписываеш (копипастиш)  из него нужные тебе ф-ции в свой myheader.h
типа так:
Код:
....
void func1(int param1); external "libpq.dll" ;
int func2(int param2); external "libpq.dll" ;
...
и т.п. только нужно прверись синтаксис.. типа кавычки и точки с запятой
3. подключаешь СВОЙ заголовник myheader.h  в твое приложение и используеш ф-ции func1 и func2 в своем приложении... при этом заголовник libpq-fe.h нафик не нужен :)
4. собираешь свое приложение и работай на здоровье.. идея вот такая :)