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

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

3 ответа

Решение

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

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

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

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

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

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

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

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

Я считаю полезным понять основные инструменты. Это 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 кл позвонит 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 в командной строке ссылки.

Предположим, что исходный файл, который вы хотите скомпилировать, - это main.cpp и ваши example_dll.dll и example_dll.lib . теперь бегиcl.exe main.cpp /EHsc /link example_dll.libтеперь вы можете получить main.exe

Другие вопросы по тегам