1

我不明白这一段:

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

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

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

4

2 回答 2

0

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

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

于 2018-03-07T17:23:13.967 回答
0

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

即用于 MS VC++ 的 mydll.lib 或用于GCC的 mylib-dll.a

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

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

于 2018-03-07T17:29:59.767 回答