Тип файла DEF
У нас есть пять существующие программные обеспечения, связанные с файлами DEF (как правило это программное обеспечение от Microsoft Corporation, известное как Microsoft Visual Studio), и их можно отнести к категории основных типов файлов четыре. Традиционно эти файлы имеют формат Module Definition File . Расширение файла DEF указано преимущественно в категории Developer Files. В менее распространенных приложениях они также могут быть Spreadsheet Files или Game Files.
Просматривать файлы DEF можно с помощью операционных систем Windows, Mac и Linux. Они обычно находятся на настольных компьютерах (и ряде мобильных устройств) и позволяют просматривать и иногда редактировать эти файлы. Рейтинг популярности данных файлов составляет «Низкий», что означает, что они не очень распространены.
Интересно узнать больше о расширении файла DEF? Для того, чтобы узнать о программе, открывающей файлы DEF, а также ознакомиться с другими советами по устранению неполадок, рекомендуется обратиться к подробной информации о файле, представленной ниже.
Экспорт из библиотеки DLL с использованием DEF-файлов
DEF-файл определения модуля (*.def) — это текстовый файл, содержащий один или несколько операторов модуля, описывающих различные атрибуты библиотеки DLL. Если вы не используете ключевое слово __declspec(dllexport) для экспорта функций библиотеки DLL, то для библиотеки 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
При использовании мастера MFC DLL для создания библиотеки DLL MFC мастер создает скелет DEF-файла и автоматически добавляет его в проект. Добавьте в этот файл имена функций, подлежащих экспорту. Для библиотек DLL, отличных от MFC, создайте DEF-файл и добавьте его в проект. Затем выберите Проект>Свойства>Компоновщик>Ввод>Файл определения модуля и введите имя DEF файла. Повторите этот шаг для каждой конфигурации и платформы или сделайте это одновременно, выбрав Конфигурация = Все конфигурации и Платформа = Все платформы.
При экспорте функций в файл C++ необходимо либо поместить внутренние имена в DEF-файл, либо определить экспортированные функции с помощью стандартной компоновки C, используя модификатор extern «C». Если необходимо поместить внутренние имена в DEF-файл, их можно получить с помощью средства DUMPBIN или с помощью параметра /MAP компоновщика. Обратите внимание, что внутренние имена, создаваемые компилятором, зависят от компилятора. Если в DEF-файл помещаются внутренние имена, созданные компилятором Microsoft C++ (MSVC), то приложения, которые связаны с библиотекой DLL, также должны быть построены с использованием той же версии компилятора MSVC, чтобы внутренние имена в вызывающем приложении совпадали с экспортированными именами в DEF-файле библиотеки DLL.
Библиотека DLL, созданная с помощью Visual Studio 2015, может быть использована приложениями, созданными с помощью Visual Studio 2017 или Visual Studio 2019.
Если вы создаете расширение библиотеки DLL и экспортируете с помощью DEF-файла, поместите следующий код в начало и в конец файлов заголовков, содержащих экспортированные классы:
#undef AFX_DATA #define AFX_DATA AFX_EXT_DATA // #undef AFX_DATA #define AFX_DATA
Эти строки гарантируют, что переменные MFC, которые используются внутри классов или добавляются в классы, экспортируются (или импортируются) из библиотеки DLL расширения MFC. Например, при создании производного класса с помощью DECLARE_DYNAMIC макрос расширяется, добавляя в класс переменную элемента CRuntimeClass . Если не указывать эти четыре строки, то библиотека DLL может скомпилироваться или скомпоноваться неправильно или вызывать ошибку, когда клиентское приложение связывается с библиотекой DLL.
При сборке библиотеки DLL компоновщик использует DEF-файл для создания файла экспорта (EXP) и файла библиотеки импорта (LIB). Затем компоновщик использует файл экспорта для создания файла DLL. Исполняемые файлы, которые неявно связываются с библиотекой DLL, компонуются с библиотекой импорта при их построении.
Обратите внимание, что MFC использует DEF-файлы для экспорта функций и классов из MFCx0.dll.
Выберите действие
- Экспорт из библиотеки DLL с использованием __declspec(dllexport)
- Экспорт и импорт с использованием AFX_EXT_CLASS
- Экспорт функций на языке C++ для использования в исполняемых модулях, исходный код которых написан на языке C
- Экспорт функций на языке C для использования в исполняемых файлах, исходный код которых написан на языке C или C++
- Определение подходящего способа экспорта
- Импорт в приложение с помощью __declspec(dllimport)
- Инициализация библиотеки DLL
Дополнительные сведения
- DEF-файлы
- Правила для операторов определения модуля
- Внутренние имена
- Импорт и экспорт встраиваемых функций
- Взаимный импорт
Exporting from a DLL Using DEF Files
A module-definition or DEF file (*.def) is a text file containing one or more module statements that describe various attributes of a DLL. If you are not using the __declspec(dllexport) keyword to export the DLL’s functions, the DLL requires a DEF file.
A minimal DEF file must contain the following module-definition statements:
- The first statement in the file must be the LIBRARY statement. This statement identifies the DEF file as belonging to a DLL. The LIBRARY statement is followed by the name of the DLL. The linker places this name in the DLL’s import library.
- The EXPORTS statement lists the names and, optionally, the ordinal values of the functions exported by the DLL. You assign the function an ordinal value by following the function’s name with an at sign (@) and a number. When you specify ordinal values, they must be in the range 1 through N, where N is the number of functions exported by the DLL. If you want to export functions by ordinal, see Exporting Functions from a DLL by Ordinal Rather Than by Name as well as this topic.
For example, a DLL that contains the code to implement a binary search tree might look like the following:
LIBRARY BTREE EXPORTS Insert @1 Delete @2 Member @3 Min @4
If you use the MFC DLL Wizard to create an MFC DLL, the wizard creates a skeleton DEF file for you and automatically adds it to your project. Add the names of the functions to be exported to this file. For non-MFC DLLs, create the DEF file yourself and add it to your project. Then go to Project > Properties > Linker > Input > Module Definition File and enter the name of the DEF file. Repeat this step for each configuration and platform, or do it all at once by selecting Configuration = All Configurations, and Platform = All Platforms.
If you are exporting functions in a C++ file, you have to either place the decorated names in the DEF file or define your exported functions with standard C linkage by using extern «C». If you need to place the decorated names in the DEF file, you can obtain them by using the DUMPBIN tool or by using the linker /MAP option. Note that the decorated names produced by the compiler are compiler specific. If you place the decorated names produced by the Microsoft C++ compiler (MSVC) into a DEF file, applications that link to your DLL must also be built using the same version of MSVC so that the decorated names in the calling application match the exported names in the DLL’s DEF file.
A DLL built with Visual Studio 2015 can be consumed by applications built with Visual Studio 2017 or Visual Studio 2019.
If you are building an extension DLL, and exporting using a DEF file, place the following code at the beginning and end of your header files that contain the exported classes:
#undef AFX_DATA #define AFX_DATA AFX_EXT_DATA // #undef AFX_DATA #define AFX_DATA
These lines ensure that MFC variables that are used internally or that are added to your classes are exported (or imported) from your MFC extension DLL. For example, when deriving a class using DECLARE_DYNAMIC , the macro expands to add a CRuntimeClass member variable to your class. Leaving out these four lines might cause your DLL to compile or link incorrectly or cause an error when the client application links to the DLL.
When building the DLL, the linker uses the DEF file to create an export (.exp) file and an import library (.lib) file. The linker then uses the export file to build the DLL file. Executables that implicitly link to the DLL link to the import library when they are built.
Note that MFC itself uses DEF files to export functions and classes from the MFCx0.dll.
What do you want to do?
- Export from a DLL using __declspec(dllexport)
- Export and import using AFX_EXT_CLASS
- Export C++ functions for use in C-language executables
- Export C functions for use in C or C++-language executables
- Determine which exporting method to use
- Import into an application using __declspec(dllimport)
- Initialize a DLL
What do you want to know more about?
- .def files
- Rules for module-definition statements
- Decorated names
- Importing and exporting inline functions
- Mutual imports
При подготовке материала использовались источники:
https://www.solvusoft.com/ru/file-extensions/file-extension-def/
https://learn.microsoft.com/ru-ru/cpp/build/exporting-from-a-dll-using-def-files?view=msvc-170
https://learn.microsoft.com/en-us/cpp/build/exporting-from-a-dll-using-def-files?view=msvc-170