Как в программе на C++ использовать функции из DLL?

il67

Как в программе на C++ использовать функции из DLL-файла?
Подскажите, пожалуйста, а то что-то не получается, пишет "unresolved external symbol"

tamusyav

Такое сообщение часто появляется, если где-то забыт extern "C". Поразглядывай DLL-ку (чем угодно, хоть блокнотом): действительно ли там лежат те функции, про которые сказано unresolved external?

il67

да, прописал в программе такую вещь
extern "C" sqlite * sqlite_open(const char *filename, int mode, char **errmsg);
.dll файл кинул в папку в которой все компилица(собираю в Visual Studio 6.0
а оно заразо все равно пишет
sc.obj : error LNK2001: unresolved external symbol _sqlite_open

il67

функции действительно лежат...

tamusyav

А ты уверен, что в dll-ке _sqlite_open, а не sqlite_open?

il67

в DLL именно sqlite_open
откуда берется это нижнее подчеркивание я не понимаю...

tamusyav

А, еще: lib-файл, соответствующий dll-ке, включен в компоновку?

il67

lib файла нет,
видимо в этом и причина?

tamusyav

В опциях компиляции есть что-то типа "Generate underscores".

tamusyav

Его надо сгенерить, если используется статическая компоновка (название генерилки забыл, она входит в состав VS). Откуда линкер узнает о том, что эту функцию надо искать в dll-ке?

il67

Чет не вижу пока как его сгенерить..

tamusyav

А, наврал. Все не совсем так: http://support.microsoft.com/kb/131313

il67

это жесть какая-то, а я надеялся что все просто=)
спасибо!

vall

даа, винда это тебе не unix =)

Reves2

если лень создавать lib, то можно пользоваться руками загрузить LoadLibrary/GetProcAddress

SPARTAK3959

В Delphi все просто - пишется модуль в котором на каждую функцию приходится по одной строчке.

evgen5555

Может, просвятишь, чем работа с SO-шниками в unix отличается от винды?

vall

линькуются малость попроще, есть всякие штуки типа pkg-config и прочее
и вобще присутвует некая культура использования использования разделяемых библиотек, виндовый же софт обычно таскает всё нестандартное с собой.

evgen5555

Ну, я не про конфигуре-маке-инстал говорю, а более конкретно.
Есть у тебя libgovno-1.1.3.so и нету libgovno-1.1.3.a
Что требуется сделать, чтобы использовать то, что покажет nm?

pitrik2

хехе
щас окажется что в лине это гораздо сложнее делается
а зачем вообще это надо? почему нельзя использовать динамическую загрузку либ?
это и в винде и в лине одинакого делается

pitrik2

В Delphi все просто - пишется модуль в котором на каждую функцию приходится по одной строчке.
не понятно
поясни

Andbar

unit myimportsunit;
interface
...
{function|procedure} bla_bla_bla[(parameter:_mytype[, ...])][: _mytype2];
...
inplementation
...
{function|procedure} bla_bla_bla; external 'mydll.dll'[ name dllfuncname];
...
end.
---------------------
если внутри модуля, то можно сразу
{function|procedure} bla_bla_bla[(parameter:_mytype[, ...])][: _mytype2]; external 'mydll.dll'[ name dllfuncname];
т.е., для подключение любой функции/процедуры из любой либы не нужно ничего кроме знания её прототипа и имени.
Оставить комментарий
Имя или ник:
Комментарий: