Поделиться через


Экспорт из библиотеки DLL с использованием DEF-файлов

Обновлен: Ноябрь 2007

Файл определения модуля (DEF-файл) — это текстовый файл, содержащий один или несколько операторов модуля, описывающих различные атрибуты библиотеки DLL. Если для экспорта функций библиотеки DLL не используется ключевое слово __declspec(dllexport), то для библиотеки DLL потребуется DEF-файл.

DEF-файл должен содержать, как минимум, следующие операторы определения модуля.

  • Первым в файле должен быть оператор LIBRARY. Этот оператор определяет DEF-файл как принадлежащий библиотеке DLL. За оператором LIBRARY следует имя DLL-файла. Компоновщик помещает это имя в библиотеку импорта DLL.

  • Оператор EXPORTS перечисляет имена и, при необходимости, порядковые номера функций, экспортируемых посредством библиотеки DLL. Для присвоения функции порядкового номера необходимо после имени функции поставить символ (@) и указать номер. Порядковые номера должны быть в пределах от 1 до N, где N — число функций, экспортируемых посредством библиотеки DLL. Если необходимо экспортировать функции по порядковому номеру, см. раздел Экспорт функций из DLL по порядковому номеру, а не по имени, а также данный раздел.

Например, библиотека DLL, содержащая код для реализации дерева поиска двоичных файлов, может иметь следующий вид:

LIBRARY   BTREE
EXPORTS
   Insert   @1
   Delete   @2
   Member   @3
   Min   @4

Если для создания библиотеки DLL MFC используется мастер библиотек DLL MFC, то мастер создает скелет DEF-файла и автоматически добавляет его к проекту. Остается лишь указать имена функций, подлежащих экспорту в этот файл. Для библиотек DLL, не принадлежащих MFC, необходимо создать DEF-файл самостоятельно и добавить его в проект.

При экспорте функции в файл C++ необходимо либо поместить декорированные имена в DEF-файл, либо определить экспортируемые функции с помощью стандартных средств компоновки C, используя внешний псевдоним "C". Если необходимо поместить декорированные имена в DEF-файл, можно получить их с помощью средства DUMPBIN или параметра компоновщика /MAP. Обратите внимание, что декорированные имена, созданные компилятором, зависят от компилятора. Если поместить декорированные имена, созданные компилятором Visual C++, в DEF-файл, то приложения, связанные с библиотекой DLL, также должны быть построены с использованием той же версии Visual C++, чтобы декорированные имена в вызывающем приложении соответствовали экспортируемым именам в DEF-файле библиотеки DLL.

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

#undef AFX_DATA
#define AFX_DATA AFX_EXT_DATA
// <body of your header file>
#undef AFX_DATA
#define AFX_DATA

Эти строки обеспечат экспорт из DLL-библиотеки расширения (или импорт в эту библиотеку) переменных MFC, используемых внутри классов или добавленных к классам. Например, при создании производного класса с использованием DECLARE_DYNAMIC макрос расширяется и включает в класс переменную-член CRuntimeClass. Если исключить эти четыре строки, то библиотека DLL может быть некорректно скомпилирована или скомпонована или же может возникнуть ошибка при ссылке клиентского приложения на библиотеку DLL.

При построении библиотеки DLL компоновщик использует DEF-файл для создания файла экспорта (EXP) и файла библиотеки импорта (LIB). Затем компоновщик использует этот файл экспорта для построения DLL-файла. Исполняемые файлы, которые неявно ссылаются на библиотеку DLL, ссылаются при построении на библиотеку импорта.

Следует заметить, что MFC использует DEF-файлы для экспорта функций и классов из файла MFCx0.dll.

Задачи, которые необходимо выполнить

Дополнительные сведения

См. также

Основные понятия

Экспорт из библиотеки DLL