Файлы .def C/C++ DLLs

22
задан Oz123 21 July 2014 в 19:02
поделиться

6 ответов

Мое понимание - то, что .def файлы обеспечивают альтернативу __ declspec (dllexport) синтаксис с дополнительной выгодой способности явно определить ординалы экспортируемых функций. Это может быть полезно при экспорте некоторых функций только ординалом который не показывает столько же информации о самой функции (например: многие из ОС экспорт внутреннего DLL функционируют только ординалом).

Видят Примечание ссылочной страницы .

, что имена в .def файле должны соответствовать именам в двоичном файле. Таким образом, если Вы использующий C или C++ с 'экстерном "C" {...}', имена не будут искажены; иначе необходимо использовать корректные скорректированные имена для определенной версии компилятора, используемого для генерации DLL. __ declspec () функция делает это все автоматически.

20
ответ дан Nick 29 November 2019 в 03:44
поделиться

Я нахожу, что использование и __ declspec (dllexport) и .def файл вместе полезно в создании портативного DLLs, т.е. DLLs, который можно назвать от кода, скомпилированного с другим компилятором или с различными параметрами компилятора.

Просто помещение __ declspec (dllexport) на Ваших объявлениях функции заставит те функции "экспортироваться" Вашим DLL (по крайней мере, в Windows) так, чтобы их можно было назвать снаружи DLL.

Однако добавление к сборке .def файл, который перечисляет все Ваши экспортируемые функции, позволяет Вам остановить компиляторы Microsoft (например), от добавления начального символа подчеркивания и запаздывающей информации о ширине параметра к экспортируемому имени функции (по крайней мере, в сочетании с __ stdcall директива, также полезная для мобильности). Например, объявление функции

void foo(int i);

могло закончить тем, что было экспортировано как "_foo@4", если Вы не осторожны относительно соглашения о вызовах и .def использования файла.

Хранение экспортируемых имен функций в таблице символов, свободной от такого художественного оформления имени, входит действительно удобное при создании GetProcAddress () вызовами как часть загрузки и сцепления в DLL явно во времени выполнения. т.е. получить указатель на вышеупомянутое функциональное нечто () (принятие его экспортировалось вообще) во времени выполнения, Вы идеально просто хотите звонить:

HANDLE dllHandle = LoadLibrary("mydll.dll");
void* fooFcnPtr = GetProcAddress(dllHandle, "foo");

С некоторым соответствующим ошибочным случаем, проверяющим, конечно!

Использование .def файла плюс __ stdcall, __ declspec (dllexport) и экстерн "C" на Ваших объявлениях функции при создании DLL гарантирует, что вышеупомянутый клиентский код будет работать на широкий спектр компиляторов и параметров компилятора.

24
ответ дан 29 November 2019 в 03:44
поделиться

Для заинтересованных все еще..., чтобы смочь связаться с dll и определением регистрируют Вас, также требуют библиотечного файла. В окнах это может быть сделано из определения с помощью инструмента 'LIB'. Посмотрите ниже для примера командной строки способ сделать это.

lib /machine:i386 /def:sqlite3.def

Hope это помогает другим.

10
ответ дан cweston 29 November 2019 в 03:44
поделиться

. Файлы DEF были более распространены в 16-разрядных окнах, где они обычно были единственным способом определить, какие символы должны быть экспортированы.

, Кроме того, они обеспечили средство определить экспорт порядковым номером (@1, @2 и т.д.), а не по имени. Этот метод поиска символов использовался, когда производительность была действительно важна, такой как в видеодрайверах.

4
ответ дан Ferruccio 29 November 2019 в 03:44
поделиться

Я не работал с DLLs очень, но мое понимание - то, что для экспортируемых функций C++, Вы shold используют "__ declspec (dllexport)", и для экспортируемых функций C необходимо записать .def файл. Это, вероятно, потому что перегрузка поддержки функций C++, но функции C не делают.

3
ответ дан Hosam Aly 29 November 2019 в 03:44
поделиться

Мое понимание - то, что .def файлы не делают на самом деле определяет, который должна быть экспортирована вся пчела. Это просто содержит экспортируемую пчелу и их порядковые числа. Если Вы хотите на самом деле экспортировать конкретный API, необходимо определить __ declspec (dllexport) в определении API и __ declspec (dllimport) в объявлении.

преимущество файла определения состоит в том, что, он помогает Вам уже поддержать совместимость невыполнения обещания с realsed dlls., т.е. он поддерживает порядковые числа для пчелы. Предположим, что Вы добавляете новый API в dll, тогда компоновщик смотрит на Ваш .def файл genearate порядковое число для ne wapi, таким образом, что порядковые числа для старой пчелы неповреждены.

Так, если клиентский код использует последний dll, он не повреждает существующую пчелу.

3
ответ дан chappar 29 November 2019 в 03:44
поделиться