Как использовать сторонний DLL-файл в Visual Studio C++?
Я понимаю, что мне нужно использовать LoadLibrary(). Но какие еще шаги мне нужно предпринять, чтобы использовать сторонний DLL-файл?
Я просто запрыгнул в C++, и это единственная часть, которую я не понимаю (как программист на Java). Я просто смотрю на то, как я могу использовать Qt Library и tesseract-ocr, но этот процесс для меня не имеет смысла и так сложен для Google.
Как мне сообщить компилятору о функциях, которые я использую? Должен ли быть включаемый файл от стороннего поставщика?
6 ответов
Как и все остальные, LoadLibrary - трудный способ сделать это, и вряд ли когда-либо понадобится.
DLL должна содержать файл.lib для линковки и один или несколько заголовочных файлов для #include в ваши источники. Заголовочные файлы будут определять классы и прототипы функций, которые вы можете использовать из DLL. Это понадобится вам, даже если вы используете LoadLibrary.
Чтобы установить связь с библиотекой, вам может потребоваться добавить файл.lib в конфигурацию проекта в разделе Linker/Input/Additional Dependencies.
Чтобы включить сторонние библиотеки DLL в мой проект VS 2008 C++, я сделал следующее (вы должны быть в состоянии перевести на 2010, 2012 и т. Д.)...
Я поместил заголовочные файлы в свое решение вместе с другими моими заголовочными файлами, внес изменения в мой код для вызова функций DLL (иначе зачем нам все это делать?).:^) Затем я изменил сборку, чтобы связать код LIB с моим EXE-файлом, скопировать библиотеки DLL на место и очистить их, когда я произвел "очистку" - я объясню эти изменения ниже.
Предположим, у вас есть 2 сторонних DLL, A.DLL и B.DLL, и у вас есть заглушка LIB-файл для каждого (A.LIB и B.LIB) и заголовочные файлы (AH и BH).
- Создайте каталог "lib" в каталоге вашего решения, например, с помощью Windows Explorer.
- Скопируйте сторонние файлы.LIB и.DLL в этот каталог.
(Вам нужно будет внести следующий набор изменений один раз для каждой цели сборки исходного кода, которую вы используете (Debug, Release).)
Сделайте ваш EXE-файл зависимым от файлов LIB
- Перейдите в Свойства конфигурации -> Линкер -> Ввод -> Дополнительные зависимости и перечислите свои файлы.LIB по одному, разделенные пробелами:
A.LIB B.LIB
- Перейдите в "Свойства конфигурации" -> "Общие" -> "Дополнительные каталоги библиотек" и добавьте каталог "lib" в любой каталог, который у вас уже есть. Записи разделяются точкой с запятой. Например, если вы уже имели
$(SolutionDir)fodder
там вы меняете его на$(SolutionDir)fodder;$(SolutionDir)lib
добавить "lib".
- Перейдите в Свойства конфигурации -> Линкер -> Ввод -> Дополнительные зависимости и перечислите свои файлы.LIB по одному, разделенные пробелами:
Принудительно скопировать библиотеки DLL в выходной каталог
- Перейдите в Свойства конфигурации -> События сборки -> Событие после сборки
- Введите следующую строку для командной строки (значения переключателей см. В разделе "XCOPY /?" В окне DOS):
XCOPY "$(SolutionDir)"\lib\*.DLL "$(TargetDir)" /D /K /Y
- Вы можете поставить что-то вроде этого для Описание:
Copy DLLs to Target Directory
- Исключено из сборки должно быть
No
, НажмитеOK
,
Скажите VS, чтобы очистить библиотеки DLL, когда он очищает выходную папку:
- Перейдите в Свойства конфигурации -> Общие -> Расширения для удаления при очистке и нажмите "..."; добавлять
*.dll
в конец списка и нажмитеOK
,
- Перейдите в Свойства конфигурации -> Общие -> Расширения для удаления при очистке и нажмите "..."; добавлять
Это два способа использования DLL-файла в Windows:
Существует библиотека заглушки (.lib) со связанными заголовочными файлами. Когда вы связываете свой исполняемый файл с lib-файлом, он автоматически загружает файл DLL при запуске программы.
Загрузка DLL вручную. Обычно это то, что вы хотите сделать, если вы разрабатываете систему плагинов, в которой есть много DLL-файлов, реализующих общий интерфейс. Проверьте документацию для LoadLibrary и GetProcAddress для получения дополнительной информации об этом.
Я подозреваю, что для Qt есть заголовки и статическая библиотека, которую вы можете включить и связать в своем проекте.
Чтобы использовать Qt с динамическим связыванием, вы должны указать lib
файлы (обычно qtmaind.lib
, QtCored4.lib
а также QtGuid4.lib
для "отладочной" конфигурации) вProperties » Linker » Input » Additional Dependencies
,
Вы также должны указать путь, где находятся библиотеки, а именно:Properties » Linker » General » Additional Library Directories
,
И вам нужно сделать соответствующий .dll
Доступны во время выполнения, либо храня их в той же папке, что и ваш .exe
или в папке, которая находится на вашем пути.
Вам нужно использовать LoadLibrary, только если вы хотите позднее связать и разрешить импортированные функции только во время выполнения. Самый простой способ использовать стороннюю DLL - это создать ссылку на.lib.
В ответ на ваше редактирование:
Да, сторонний API должен состоять из DLL и / или библиотеки, содержащей файлы реализации и заголовки, которые объявляют требуемые типы. Вам нужно знать определения типов, какой бы метод вы ни использовали - для LoadLibrary вам нужно определить указатели на функции, чтобы вы могли легко написать собственный заголовочный файл. По сути, вам нужно использовать LoadLibrary только в случае позднего связывания. Одной из веских причин для этого может быть, если вы не уверены, будет ли DLL доступен на целевом ПК.
Если вы предполагаете, что сможете использовать его, то сторонняя библиотека должна иметь файл *.lib, а также файл *.dll. Вам просто нужно добавить *.lib в список входных файлов в опциях вашего проекта 'Linker'.
Этот *.lib файл не обязательно является "статической" библиотекой (которая содержит код): вместо этого *.lib может быть просто файлом, который связывает ваш исполняемый файл с DLL.