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


Определение подходящего метода экспорта

Чтобы определить подходящий метод экспорта функций (DEF-файл или ключевое слово __declspec(dllexport)), ответьте на следующие вопросы:

  • Будут ли в последствии добавляться дополнительные экспортируемые функции?

  • Кто использует будет использовать библиотеку DLL? Например, сторонняя ли это библиотека DLL, используемая исполняемыми файлами, которые невозможно повторно построить, или это библиотека DLL, используемая только такими приложениями, которые можно легко перестроить?

Преимущества и недостатки использования DEF-файлов

Экспорт функций в DEF-файл позволяет контролировать порядковые номера экспортных операций. При добавлении дополнительных экспортируемых функций в библиотеку DLL можно им назначить более высокие порядковые номера (по сравнению с другими экспортируемыми функциями). В этом случае приложениям, использующим неявное связывание, не приходится выполнять повторную компоновку с использованием новой библиотеки импорта, содержащей новые функции. Это очень важно, например, в случае если разрабатывается сторонняя библиотека DLL, которая будет использоваться многими приложениями. Можно продолжить оптимизацию библиотеки DLL с помощью добавления дополнительных функциональных возможностей при условии, что существующие приложения будут работать с новой библиотекой DLL. Построение библиотеки MFC DLL выполняется с помощью DEF-файлов.

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

Главным недостатком использования DEF-файла является то, что при экспортировании функций в файл C++ необходимо поместить в DEF-файл декорированные имена или использовать модификатор extern "C", чтобы компилятор не декорировал имя в библиотеке.

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

Преимущества и недостатки использования __declspec(dllexport)

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

Выполняемые задачи

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

См. также

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

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