Связывание DLL с Visual C++

Я пытаюсь использовать внешнюю DLL (предоставленную AutoItX) с Visual C++ 2010. AutoItX предоставляет DLL, но по какой-то причине не LIB, поэтому я создал ее с помощью Visual Studio.

Проблема в том, что компоновщик, похоже, не может связать библиотеку. Я добавил AutoItX3.lib в качестве дополнительной зависимости в разделе «Свойства» -> «Компоновщик» -> «Входы» и добавил каталог в «Свойства» -> «Компоновщик» -> «Общие» -> «Дополнительные каталоги библиотек». Независимо от того, что я делаю, я все равно получаю эти ошибки:

1>main.obj : error LNK2019: unresolved external symbol _AU3_Send@8 referenced in function _WinMain@16
1>main.obj : error LNK2019: unresolved external symbol _AU3_WinWaitActive@12 referenced in function _WinMain@16
1>main.obj : error LNK2019: unresolved external symbol _AU3_Run@12 referenced in function _WinMain@16
1>main.obj : error LNK2019: unresolved external symbol _AU3_Sleep@4 referenced in function _WinMain@16

AU3_Send, AU3_WinWaitActive, AU3_Run и AU3_Sleep — это функции, вызываемые программой main.cpp. У меня действительно нет идей, потому что эти функции явно существуют в DLL. Любая помощь будет оценена по достоинству.


person ideasrule    schedule 25.06.2012    source источник


Ответы (1)


Очень часто в качестве интерфейса используются только библиотеки DLL. Так делают многие поставщики программного обеспечения. Выполнение этого имеет следующие воздействия (последствия):

  • клиентские приложения могут динамически подключаться только к предоставленной библиотеке (отсюда и название Dynamic-Link Library). Привязка между поставщиком (библиотекой) и потребителем (приложением или любой другой библиотекой) выполняется динамически.
  • клиент должен использовать LoadLibray и GetProcAddress для привязки библиотеки и получения желаемых символов (функций)
  • интерфейс (контракт) между библиотекой и потребителем должен быть задокументирован через файл заголовка - см., например, AutoIt3.h - (или любую другую документацию, такую ​​как файл справки, ..)
  • LIB не предоставляется (поскольку он не нужен), поскольку связывание происходит во время выполнения, а не во время компилятора/компоновщика.

Чтобы решить вашу проблему, вам просто нужно удалить статическую зависимость (LIB), которую вы поместили в конфигурацию Visual Studio, и установить зависимость во время выполнения, используя LoadLibrary и GetProcAddress.

person mox    schedule 26.06.2012
comment
Спасибо. Значит, нет способа избежать LoadLibrary и GetProcAddress? Почему в Eclipse с MinGW я могу напрямую ссылаться на библиотеки DLL и напрямую вызывать их функции? - person ideasrule; 27.06.2012
comment
Другого пути нет. На самом деле некоторые обращаются к PEB напрямую (en.wikipedia.org/wiki/Process_Environment_Block), но это сложнее. Я не использую Eclipse, но полагаю, что он имеет оболочку для LoadLibrary и GetProcAddress и делает привязку более гладкой. - person mox; 27.06.2012