【发布时间】:2018-08-15 21:26:17
【问题描述】:
我不明白这一段:
在 .def 文件中导出函数可让您控制导出序数。将导出函数添加到 DLL 时,可以为其分配比任何其他导出函数更高的序数值。执行此操作时,使用隐式链接的应用程序不必重新链接到包含新函数的导入库。如果您正在设计一个供许多应用程序使用的 DLL,这将非常方便,因为您可以添加新功能并确保它继续与已经依赖它的应用程序一起正常工作。例如,MFC DLL 是使用 .def 文件生成的。
如果使用 .def 文件而不是 __declspec(dllexport) 在函数添加到 dll 的情况下,为什么应用程序不必重新链接导入库?
cfhttps://docs.microsoft.com/en-us/cpp/build/determining-which-exporting-method-to-use
【问题讨论】:
-
必须让 .def 文件与您的代码保持同步并不是一件好事。如果您不必重命名导出,那么您永远不会真的这样做,那么 declspec 非常方便。请记住,您仍然可以使用 #pragma 注释来注入链接器的 /export 指令。
-
我不知道为什么这篇文章如此专注于按序号导出,反正没人使用(除了 MSFT)。 IMO .def 文件更重要的优点是您可以通过未损坏的名称导出函数,这使得从其他语言链接 DLL 比编写它更容易。
-
@zett42 我不明白为什么如果我们更新一个 dll 就必须重新编译我们的应用程序不是共享库不必这样做的主要目标吗?
-
如果您只添加新功能并且现有功能保持向后兼容,则无需重新构建应用程序。我真的不明白文章那部分的意义,因为您必须首先使用 .def 文件才能按序号导出。
__declspec(dllexport)函数默认按名称导出。 -
我同意@zett42 在一些测试后我可以将新的导出函数添加到我的 dll 和我的 exe 仍然工作。但是人们仍然说你必须重新链接我仍然不明白为什么
标签: c++ windows dll shared-libraries declspec