使用 .def 文件的优缺点

Pros and Cons of Using .def Files

我不明白这一段:

Exporting functions in a .def file gives you control over the export ordinals. When you add an exported function to your DLL, you can assign it a higher ordinal value than any other exported function. When you do this, applications that use implicit linking do not have to relink with the import library that contains the new function. This is very convenient if you are designing a DLL for use by many applications because you can add new functionality and also ensure that it continues to work correctly with the applications that already rely on it. For example, the MFC DLLs are built by using .def files.

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

cf https://docs.microsoft.com/en-us/cpp/build/determining-which-exporting-method-to-use

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

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

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

mydll.lib for MS VC++ or mylib-dll.a 用于 GCC

编译器和链接器更喜欢它们自己的二进制格式导入库,通常与 each-other 不兼容。当您的 DLL 是在 C/C++ 上编写的,但您的程序是在 Ada/FORTRAN/Object Pascal 等其他东西上编写的,反之亦然时,这尤其重要。因此 .def 文件可用于创建兼容的导入库。

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