Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

Чтобы установить связь с библиотекой, вам может потребоваться добавить файл .lib в конфигурацию проекта в Linker/Input/Additional Dependencies.

Ответ 2

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

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

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

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

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

  • Сделайте EXE зависимым от файлов LIB

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

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

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

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

    Copy DLLs to Target Directory

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

    • Перейдите в "Свойства конфигурации" → "Общие" → "Расширения для удаления по очистке" и нажмите "..."; добавьте *.dll в конец списка и нажмите OK.

Ответ 3

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

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

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

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

Ответ 4

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

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

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

Ответ 5

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


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

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

Ответ 6

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

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