Как использовать сторонний DLL-файл в Visual Studio C++?



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



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



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

790   6  

6 ответов:

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

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

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

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

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

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

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

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

  1. сделать в EXE-файл, зависит от Либ файлы

    • перейдите в свойства конфигурации - > Компоновщик - > ввод - > дополнительные зависимости и перечислите свои .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.

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

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

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

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

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

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

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

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


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

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

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

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

Comments

    Ничего не найдено.