Связывание DLL в Visual Studio - PullRequest
       25

Связывание DLL в Visual Studio

27 голосов
/ 21 октября 2011

Как добавить .dll в Visual Studio 2010? Я просто не могу найти вариант там.

Ответы [ 3 ]

46 голосов
/ 21 октября 2011

В Windows вы не связываетесь с файлом .dll напрямую - вместо этого вы должны использовать сопровождающий файл .lib.Для этого перейдите на Project -> Properties -> Configuration Properties -> Linker -> Additional Dependencies и добавьте путь к вашему .lib следующей строкой.

Вы также должны убедиться, что файл .dll находится либо в каталоге, содержащемся в переменной среды %PATH%, либо в том, что его копия находится в Output Directory (по умолчанию* Debug\Release в папке вашего проекта).

Если у вас нет доступа к файлу .lib, одной из альтернатив является загрузка .dll вручную во время выполнения с использованием функций WINAPI, таких как LoadLibrary и GetProcAddress .

25 голосов
/ 21 октября 2011

Вы не добавляете или не связываете напрямую с DLL, вы связываете с LIB, созданным DLL.

LIB предоставляет символы и другие необходимые данные для включения библиотеки в ваш код (статическое связывание) или обратитесь к DLL (динамическое связывание).

Чтобы связать с LIB, необходимо добавить его в список свойств проекта -> Линкер -> Ввод -> Дополнительные зависимости.Все файлы LIB здесь будут использованы при линковке.Вы также можете использовать прагму, например, так:

#pragma comment(lib, "dll.lib")

При статическом связывании код включается в ваш исполняемый файл и не имеет зависимостей во время выполнения.Динамическое связывание требует наличия библиотеки DLL с соответствующим именем и символами в пути поиска (который не только путь или системный каталог).

3 голосов
/ 10 октября 2018

Я считаю полезным понять базовые инструменты.Это cl.exe (компилятор) и link.exe (компоновщик).Вам нужно сообщить компилятору сигнатуры функций, которые вы хотите вызвать в динамической библиотеке (включая заголовок библиотеки), и вам нужно сообщить компоновщику, как называется библиотека и как ее вызывать (включая «implib»)или импортировать библиотеку).

Это примерно тот же процесс, который gcc использует для ссылки на динамические библиотеки в * nix, отличается только объектный файл библиотеки.

Знание базовых инструментов означает, что вы можете быстреенайти соответствующие настройки в IDE и проверить правильность сгенерированных командных строк.

Пример

Скажем, A.exe зависит от B.dll.Вам нужно включить заголовок B в A.cpp (#include "B.h"), затем скомпилировать и связать с B.lib:

cl A.cpp /c /EHsc
link A.obj B.lib

Первая строка генерирует A.obj, вторая - A.exe.Флаг /c указывает cl не связывать, а /EHsc указывает, какой тип исключения C ++, обрабатывающего двоичный файл, должен использовать (нет значения по умолчанию, поэтому вы должны что-то указывать)./c cl позвонит вам link.Вы можете использовать флаг /link, чтобы указать дополнительные аргументы для link и сделать все сразу, если хотите:

cl A.cpp /EHsc /link B.lib

Если B.lib не находится на пути INCLUDE, вы можете указатьотносительный или абсолютный путь к нему или добавьте его родительский каталог в ваш путь включения с флагом /I.

Если вы звоните из cygwin (как я), замените прямую косую черту тире.*

Если вы пишете #pragma comment(lib, "B.lib") в A.cpp, вы просто указываете компилятору оставить комментарий в A.obj, сообщая компоновщику ссылку на B.lib.Это эквивалентно указанию B.lib в командной строке ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...