Я не понимаю этот параграф:
Экспорт функций в файл .def дает вам контроль над порядком экспорта. Когда вы добавляете экспортированную функцию в вашу DLL, вы можете присвоить ей более высокое порядковое значение, чем у любой другой экспортируемой функции. Когда вы делаете это, приложениям, которые используют неявное связывание, не нужно повторно связываться с библиотекой импорта, которая содержит новую функцию. Это очень удобно, если вы разрабатываете DLL для использования многими приложениями, потому что вы можете добавить новые функции, а также убедиться, что она продолжает корректно работать с приложениями, которые уже полагаются на нее. Например, библиотеки MFC создаются с использованием файлов .def.
Почему приложение не должно связываться с библиотекой импорта в случае использования файла .def вместо __declspec (dllexport) в случае добавления функции в dll?
сравни https://docs.microsoft.com/en-us/cpp/build/determining-which-exporting-method-to-use
Это связано с некоторыми особенностями реализации разделяемых объектов (или DLL) в MSFT. В мире Microsoft, чтобы импортировать функции в ваш процесс, вам нужен не только сам общий код (.dll), но и специальная библиотека ‘import’ — .lib
файл. Этот файл статически связан с вашим приложением (так как это статическая библиотека). Эта библиотека обеспечивает «связь» между именами функций и порядковыми номерами функций.
Обычно, каждый раз, когда вы выпускаете новую версию DLL, все приложения, которые ее используют, должны быть связаны с новой сопровождающей версией статической библиотеки импорта (.lib
) чтобы иметь возможность использовать эту новую библиотеку DLL. Это связано с тем, что порядковые номера функций больше не действительны после создания новой библиотеки. Тем не менее, если вы используете .def
файл, вы можете назначить порядковые номера вручную, и убедиться, что порядковые номера остаются прежними для ранее доступных функций — и, таким образом, .lib
файл по-прежнему будет действительным.
Хорошо, если у вас есть файл .def, вы можете использовать его для создания библиотеки импорта.
То есть mydll.lib для MS VC ++ или MyLib-dll.a для GCC
Компиляторы и компоновщики предпочитают свои собственные библиотеки импорта двоичных форматов, обычно несовместимые друг с другом. Это особенно важно, когда ваша DLL написана на C / C ++, но ваша программа написана на чем-то другом, например, Ada / FORTRAN / Object Pascal и т. Д. Или наоборот. Таким образом, файлы .def можно использовать для создания совместимой библиотеки импорта.
Параграф, говорящий о том, как скрыть некоторые функции из библиотеки импорта, с ручным редактированием файла .DEF и указанием компоновщику скрыть некоторые функции.