Экспорт из библиотеки DLL с использованием __declspec(dllexport)
С помощью ключевого слова __declspec(dllexport)
вы можете экспортировать данные, функции, классы или функции-члены класса из библиотеки DLL. При использовании ключевого слова __declspec(dllexport)
в объектный файл добавляется директива экспорта, поэтому необходимости в DEF-файле нет.
Это особенно удобно при экспорте дополненных имен функций C++. Поскольку стандартные соглашения о дополнении имен отсутствуют, имена экспортированных функций могут различаться в разных версиях компилятора. Если вы используете __declspec(dllexport)
, перекомпиляция библиотеки DLL и зависимых EXE-файлов требуется только для того, чтобы учесть изменения в соглашениях об именовании.
Многие директивы экспорта, в том числе на основе порядковых номеров, а также NONAME и PRIVATE, могут определяться только в DEF-файле. Способов определить эти атрибуты без DEF-файла не существует. Тем не менее, если использовать __declspec(dllexport)
вместе с DEF-файлом, ошибки сборки возникать не будут.
Для экспорта функций ключевое слово __declspec(dllexport)
должно использоваться слева от ключевого слова соглашения о вызовах, если оно задано. Например:
__declspec(dllexport) void __cdecl Function1(void);
Чтобы экспортировать все открытые члены данных и функции-члены в классе, это ключевое слово должно использоваться слева от имени класса следующим образом:
class __declspec(dllexport) CExampleExport : public CObject
{ ... class definition ... };
Примечание.
__declspec(dllexport)
нельзя применять к функции с соглашением о вызовах __clrcall
.
При построении библиотеки DLL, как правило, создается файл заголовка, который содержит прототипы функций и (или) экспортируемые классы, а также добавляется ключевое слово __declspec(dllexport)
в раздел объявлений файла заголовка. Чтобы сделать код более удобочитаемым, определите макрос для __declspec(dllexport)
, а затем используйте этот макрос для каждого экспортируемого символа:
#define DllExport __declspec( dllexport )
__declspec(dllexport)
сохраняет имена функций в таблице экспорта библиотеки DLL. Сведения об оптимизации размера этой таблицы см. в разделе Экспорт функций из библиотеки DLL по порядковому номеру, а не по имени.