Як використовувати сторонній файл DLL у Visual Studio C ++?


76

Я розумію, що мені потрібно використовувати LoadLibrary (). Але які ще кроки мені потрібно зробити, щоб використовувати сторонній файл DLL?

Я просто перейшов на C ++, і це єдина частина, яку я не отримую (як програміст Java). Я просто розглядаю, як я можу використовувати бібліотеку Qt і tesseract-ocr, проте процес не має для мене сенсу і його так складно загуглити.

Як сказати компілятору функцій, якими я користуюся? Чи повинен бути файл включення від стороннього постачальника?


Чи розумієте ви, як додати сторонній файл DLL у Visual Studio 2012 для C ++. Будь ласка, допоможіть мені в цьому.
afzalex

Відповіді:


72

Як кажуть усі інші, LoadLibrary - це важкий спосіб зробити це і навряд чи коли-небудь потрібний.

Бібліотека DLL повинна мати файл .lib для зв’язування та один або кілька файлів заголовків, щоб #include у ваші джерела. Файли заголовків визначать класи та прототипи функцій, які ви можете використовувати з DLL. Це вам знадобиться, навіть якщо ви використовуєте LoadLibrary.

Для зв’язку з бібліотекою, можливо, доведеться додати файл .lib до конфігурації проекту в розділі «Зв’язування / введення / додаткові залежності».


1
Дякую, інші відповіді були дуже хорошими (і корисними і для мене), але це пояснювало саме те, що я шукав.
Zombies

Діалог "Додаткові залежності" схоже на те, що він підтримує лише імена та розширення файлів, а не шляхи до файлів. Додавання імені файлу + розширення не виправило помилок "ідентифікатор не знайдений". Додавання повністю кваліфікованого шляху + ім'я файлу + також не виправило їх.
anon58192932

1
@advocate, на вкладці "Загальне" є запис "Додаткові бібліотечні каталоги". Я не уявляю, чому Microsoft розділила їх.
Марк Ренсом,

Я насправді це робив, але все ще отримую помилки Linker. Я розмістив свій файл .dll у своєму C: / Windows. Що я роблю не так?
Барт

1
@darkgaze можна використовувати #importдля автоматичного створення та включення заголовного файлу для DLL. Компілятор повинен знати декларацію всіх функцій, щоб він міг побудувати код виклику.
Марк Ренсом

67

Для включення сторонніх бібліотек 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.
  • Скопіюйте сторонні файли .LIB та .DLL у цей каталог

(Вам доведеться внести наступний набір змін один раз для кожної цільової збірки джерела, яку ви використовуєте (Налагодження, Випуск).)

  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.

2
Я намагаюся використовувати ваш метод для використання сторонніх dll-файлів. Я використовую Visual Studio 2012 ultimate, і його немає Additional Library Directoriesу Configuration Properties -> Generalвкладці. Будь ласка, допоможи мені.
afzalex

6
Це повинно бути Configuration Properties -> Linker -> General -> Additional Library Directories.
Колін Робертсон,

@afzalex ви можете знайти це в меню Властивості конфігурації> Каталоги VC ++> Каталоги бібліотек. Це зміна поколінь;)
Бохарі,

Пропущена цитата для кроку 2. Використання:XCOPY "$(SolutionDir)\lib\*.DLL" "$(TargetDir)" /D /K /Y
Трістан ШАРБОНЬЄ

@TristanCHARBONNIER Цікаво. Я майже впевнений, що скопіював / вставив свою XCOPYкоманду зі своєї робочої конфігурації. Ви хочете сказати, що цитата втрачена, бо вона у вас не спрацювала, чи це лише здогади?
багатий р

24

Це два способи використання файлу DLL у Windows:

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

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

Для Qt я підозрюю, що є заголовки та доступна статична бібліотека, яку ви можете включити та зв’язати у своєму проекті.


І є третій спосіб, подібний до вашого першого, за допомогою /MTперемикача, який статично зв’яже ваші бібліотеки. Перевага полягає в тому, що немає динамічних накладних витрат на зв’язування . Однак це не можна використовувати, якщо ви також використовуєте /clrперемикач.
Абель

2
Це стосується лише стандартної бібліотеки. Для користувальницьких бібліотек (сторонніх виробників) ви не можете статично пов’язувати DLL, якщо хтось явно не створив її статичну версію, яку ви можете пов’язати.
Laserallan

@Laserallan Я розробляю проект DLL, але коли я будую його, це просто створення файлів dllі lib. це не створення includesкаталогу. як я можу включити свої файли заголовків у проект?
середа,

Бібліотека dll / import - це виходи лінкера. Що стосується надання аксесуарів, то потрібно переконатися, що все це розподілено разом. Як це робити, залежить від вашої системи збірки, але якщо ви використовуєте cmake, подивіться на сімейство команд встановлення, яке допоможе вам структуровано визначити важливі файли для розповсюдження
Laserallan

6

Для того , щоб використовувати Qt з використанням динамічного зв'язування ви повинні вказати libфайли ( як правило qtmaind.lib, QtCored4.libі QtGuid4.libдля configration «Налагодження») в
Properties » Linker » Input » Additional Dependencies.

Ви також повинні вказати шлях, де знаходяться бібліотеки , а саме в
Properties » Linker » General » Additional Library Directories.

І вам потрібно зробити відповідні .dlls доступними під час виконання, або зберігаючи їх в тій самій папці, що і ваша, .exeабо в папці, яка знаходиться на вашому шляху .


3

Вам потрібно використовувати LoadLibrary, лише якщо ви хочете запізнювати прив’язку та вирішувати імпортовані функції лише під час виконання. Найпростіший спосіб використання сторонніх dll - це зв’язок із .lib.


У відповідь на вашу редакцію:

Так, сторонній API повинен складатися з dll та / або бібліотеки, які містять файли реалізації та заголовки, що декларує необхідні типи. Вам потрібно знати визначення типів, який би метод ви не використовували - для LoadLibrary вам потрібно буде визначити покажчики функцій, щоб ви могли так само легко писати власний файл заголовка. В основному, вам потрібно використовувати LoadLibrary лише якщо ви хочете пізнє прив'язування. Однією з вагомих причин цього може бути, якщо ви не впевнені, чи буде DLL доступний на цільовому ПК.


2

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

Цей файл * .lib не обов'язково є "статичною" бібліотекою (яка містить код): натомість * .lib може бути просто файлом, який пов'язує ваш виконуваний файл з DLL.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.