使用 .def 文件的优缺点



我不明白这一段:

导出

.def 文件中的函数使您可以控制导出序号。将导出的函数添加到 DLL 时,可以为其分配比任何其他导出函数更高的序号值。执行此操作时,使用隐式链接的应用程序不必与包含新函数的导入库重新链接。如果您正在设计供许多应用程序使用的 DLL,这将非常方便,因为您可以添加新功能,并确保它继续与已经依赖它的应用程序正常工作。例如,MFC DLL 是使用 .def 文件生成的。

为什么应用程序在使用 .def 文件的情况下不必与导入库重新链接,而不是在函数添加到 dll 的情况下__declspec(dllexport(?

参看 https://learn.microsoft.com/en-us/cpp/build/determining-which-exporting-method-to-use

这是因为共享对象(或DLL(的MSFT实现的一些细节。在Microsoft世界中,为了将函数导入您的流程,您不仅需要共享代码本身(.dll(,还需要特殊的"导入"库 - .lib文件。此文件静态链接到您的应用程序中(因为它是一个静态库(。此库在函数名称和函数序号之间提供"粘合"。

通常,每次发布新版本的DLL时,所有使用它的应用程序都必须与新的,随附的静态导入库版本(.lib(重新链接,以便能够使用这个新的DLL库。这是因为在创建新库后,函数序号通常不再有效。但是,如果您使用的是.def文件,则可以手动分配序号,并确保以前可用的函数的序号保持不变 - 因此.lib文件仍然有效。

好的,如果你有一个 .def 文件,你可以使用它来创建导入库。

即 mydll.lib for MS VC++ 或 mylib-dll.a for GCC

编译器和链接器更喜欢自己的二进制格式导入库,通常彼此不兼容。当你的DLL是用C/C++编写的,但你的程序是用Ada/FORTRAN/Object Pascal等其他东西编写的,反之亦然。因此,.def文件可用于创建兼容的导入库。

段落告诉您一种从导入库中隐藏某些功能的方法,带有手动编辑。DEF 文件并指示链接器隐藏一些函数。

最新更新