2016-06-16 6 views
0

Чтобы связать статическую библиотеку, мне нужно создать .lib из .h и .c файлов. Затем я добавляю его в свой проект, добавляю в дополнительные зависимости и компилирую.Как связать dll в визуальной студии?

Для использования dll мне нужно .dll и .lib. Этот .lib такой же, как выше или другой? Как сказать Visual Studio использовать DLL и .lin, не только .lib? Я положил .dll в каталог проекта и ничего не изменил (.exe имеет тот же размер (должно быть меньше, я думаю)).

+1

Проект DLL создает библиотеку * import *. Не то же самое, что и статическая библиотека, она очень мала и объявляет только те функции, которые вы экспортировали. Если вы не получите файл .lib, вы не построили его правильно или не забыли экспортировать функции. –

+0

DLL-проект создает только DLL-файл. Я не могу найти никаких .lib-файлов. – Stark

ответ

2

При компиляции DLL-проекта вы будете получать DLL и LIB-файл в качестве вывода. DLL содержит фактический код библиотеки; файл LIB содержит заглушки для экспортированных функций, которые помогают компоновщику в выпуске кода вызвать эту DLL.

Это очень отличается от LIB-файла, который вы получаете при компиляции статической библиотеки. Это LIB-файл содержит весь объектный код, который содержит библиотеку. Весь такой код напрямую связан с вашим исполняемым файлом, когда вы его создаете, следовательно, является «статической» частью имени.

Однако фактический способ использования очень похож. Независимо от того, связываетесь ли вы с динамической или статической библиотекой, вы указываете компоновщик (используя «Дополнительные зависимости») в файле LIB. Компилятор делает все остальное; он может указать из файла LIB, что он должен делать.

Конечно, вы должны убедиться, что это правильный файл LIB. Наличие обоих проектов (DLL и EXE) в одном решении позволит вам использовать ссылки на проекты, что делает задачу практически безупречной.

EDIT: Вы, разумеется, не получите файл LIB при сборке DLL, если не экспортирует DLL-функции. (Если он не экспортирует какие-либо функции, для клиента этой DLL нет ничего, поэтому нет причин для LIB-файла!) Самый простой способ организовать функции, которые будут экспортироваться из DLL, - использовать аннотацию __declspec(dllexport) , В сочетании с макросом вы можете договориться о том, чтобы он разрешил __declspec(dllimport) со стороны потребителя, что позволяет использовать один и тот же заголовочный файл для построения библиотеки DLL и ее использования из приложения. Больше информации об этом в моем ответе here. Кроме того, вы можете использовать a DEF file with an "EXPORTS" section.

+0

После создания и компиляции DLL-проекта (из .c и .h файлов) я получаю только файл .dll. Нет. – Stark

+0

И еще один вопрос: как использовать существующую предварительно скомпилированную .dll без .lib-файла, которую я скачал с сайта, на котором размещена библиотека? Должен ли я использовать функции LoadLibrary и GetProcAddress? – Stark

+1

@stark Это работает для меня. Я сделал следующее: добавьте новый проект в решение, указав шаблон «Win32 Project». В мастере я выбрал «DLL». Я аннотировал все функции, которые хочу экспортировать из DLL с помощью '__declspec (dllexport)', а затем я построил проект. В выходной папке я получаю 'MyDLL.dll',' MyDLL.exp', 'MyDLL.ilk',' MyDLL.lib' и 'MyDLL.pdb'. Поэтому я бы предположил, что ваша проблема в том, что вы не экспортируете какие-либо функции из DLL. Это делает DLL бесполезной. –

1

Статическая LIB или (небольшая) LIB с DLL, для обоих потребуется файл заголовка (или явные объявления функций). Тем не менее, отличается от ЛИЭСА является:

  • (Dynamic) DLL: .LIB, как файл заголовка, и файл .DLL, как файл .CPP. Точно так же, как заголовок, содержащий объявление, .LIB содержит определения импорта. Точно так же, как CPP содержит определения, .DLL содержит фактический код.
  • Static LIB: Точно так же, как целый класс реализован в формате .H (в основном в случае шаблонов) и не прикреплен .CPP-файл - этот тип LIB содержит весь код для работы программы. Точно так же компоновщик не будет жаловаться на отсутствие реализации (.CPP в приведенном выше случае), загрузчик (OS) не будет жаловаться на пропущенную DLL.

    Библиотеки на основе DLL небольшие, статические библиотеки большие (поместите здесь аналоги .H/.CPP).