Связывание 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