Как использовать сторонний DLL-файл в Visual Studio C ++? - PullRequest
64 голосов
/ 30 января 2009

Я понимаю, что мне нужно использовать LoadLibrary (). Но какие еще шаги мне нужно предпринять, чтобы использовать сторонний DLL-файл?

Я просто запрыгнул в C ++, и это единственная часть, которую я не понимаю (как программист на Java). Я просто смотрю, как я могу использовать Qt Library и tesseract-ocr, но этот процесс для меня не имеет смысла и так сложен для Google.

Как мне сообщить компилятору о функциях, которые я использую? Должен ли быть включаемый файл от стороннего поставщика?

Ответы [ 6 ]

64 голосов
/ 30 января 2009

Как все говорят, LoadLibrary - трудный способ сделать это, и вряд ли когда-либо понадобится.

DLL должна содержать файл .lib для ссылок и один или несколько файлов заголовков для #include в ваши источники. Заголовочные файлы будут определять классы и прототипы функций, которые вы можете использовать из DLL. Это понадобится вам, даже если вы используете LoadLibrary.

Для связи с библиотекой вам, возможно, придется добавить файл .lib в конфигурацию проекта в разделе Компоновщик / Вход / Дополнительные зависимости.

62 голосов
/ 06 декабря 2013

Чтобы включить сторонние библиотеки DLL в мой проект VS 2008 C ++, я сделал следующее (вы должны быть в состоянии перевести на 2010, 2012 и т. Д.) ...

Я поместил заголовочные файлы в свое решение вместе с другими моими заголовочными файлами, внес изменения в мой код для вызова функций DLL (иначе зачем нам все это делать?). : ^) Затем я изменил сборку, чтобы связать код LIB с моим EXE-файлом, скопировать библиотеки DLL на место и очистить их, когда я произвел «очистку» - я объясню эти изменения ниже.

Предположим, у вас есть 2 сторонних DLL, A.DLL и B.DLL, и у вас есть заглушка LIB-файл для каждого (A.LIB и B.LIB) и заголовочные файлы (A.H и B.H).

  • Создайте каталог "lib" в каталоге вашего решения, например, с помощью проводника Windows.
  • Скопируйте сторонние файлы .LIB и .DLL в этот каталог

(Вам нужно будет внести следующий набор изменений один раз для каждой цели сборки исходного кода, которую вы используете (Debug, Release).)

  1. Сделать ваш EXE-файл зависимым от файлов LIB

    • Перейдите в Свойства конфигурации -> Линкер -> Ввод -> Дополнительные зависимости и перечислите свои файлы .LIB там по одному, разделенные пробелами : A.LIB B.LIB
    • Перейдите в Свойства конфигурации -> Общие -> Дополнительные каталоги библиотек и добавьте свой каталог "lib" к любому, который у вас там уже есть. Записи разделяются точкой с запятой . Например, если у вас уже было $(SolutionDir)fodder, измените его на $(SolutionDir)fodder;$(SolutionDir)lib, чтобы добавить "lib".
  2. Принудительно скопировать библиотеки DLL в выходной каталог

    • Перейдите в Свойства конфигурации -> События сборки -> Событие после сборки
    • Введите в командной строке следующее (значения переключателей см. В разделе «XCOPY /?» В окне DOS):

    XCOPY "$(SolutionDir)"\lib\*.DLL "$(TargetDir)" /D /K /Y

    • Вы можете поставить что-то вроде этого для Описание:

    Copy DLLs to Target Directory

    • Исключено из сборки должно быть No. Нажмите OK.
  3. Скажите VS очистить библиотеки DLL, когда он очищает выходную папку:

    • Перейдите в Свойства конфигурации -> Общие -> Расширения для удаления при очистке и нажмите «...»; добавьте *.dll в конец списка и нажмите OK.
24 голосов
/ 30 января 2009

Это два способа использования DLL-файла в Windows:

  1. Существует библиотека заглушки (.lib) со связанными заголовочными файлами. Когда вы связываете свой исполняемый файл с файлом lib, он автоматически загружает файл DLL при запуске программы.

  2. Загрузка DLL вручную. Обычно это то, что вы хотите сделать, если вы разрабатываете систему плагинов, в которой есть много DLL-файлов, реализующих общий интерфейс. Ознакомьтесь с документацией для LoadLibrary и GetProcAddress для получения дополнительной информации об этом.

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

6 голосов
/ 30 января 2009

Чтобы использовать Qt с динамическим связыванием, вы должны указать файлы lib (обычно qtmaind.lib, QtCored4.lib и QtGuid4.lib для конфигурации "Отладка") в
Properties » Linker » Input » Additional Dependencies.

Вы также должны указать путь, по которому библиотеки будут , а именно в
Properties » Linker » General » Additional Library Directories.

И вам нужно, чтобы соответствующие .dll были доступны во время выполнения, либо сохраняя их в той же папке, что и ваш .exe, либо в папке, которая находится на вашем пути .

3 голосов
/ 30 января 2009

Вам нужно использовать LoadLibrary, только если вы хотите позднее связать и разрешить импортированные функции только во время выполнения. Самый простой способ использовать стороннюю DLL - это создать ссылку на .lib.


В ответ на ваше редактирование:

Да, сторонний API должен состоять из dll и / или lib, которые содержат файлы реализации и заголовки, которые объявляют требуемые типы. Вам нужно знать определения типов, какой бы метод вы ни использовали - для LoadLibrary вам нужно определить указатели на функции, чтобы вы могли легко написать собственный заголовочный файл. По сути, вам нужно использовать LoadLibrary только в случае позднего связывания. Одной из веских причин этого может быть то, что вы не уверены, будет ли DLL доступен на целевом ПК.

2 голосов
/ 30 января 2009

Если предполагается, что вы можете использовать его, сторонняя библиотека должна иметь файл * .lib, а также файл * .dll. Вам просто нужно добавить * .lib в список входных файлов в опциях вашего проекта 'Linker'.

Этот * .lib файл не обязательно является «статической» библиотекой (которая содержит код): вместо этого * .lib может быть просто файлом, который связывает ваш исполняемый файл с DLL.

...