.def 文件与 __declspec(dllexport) 宏

.def file vs. __declspec(dllexport) macro

本文关键字:dllexport declspec 文件 def      更新时间:2023-10-16

我们的团队正在考虑从def文件迁移到__declspec(dllexport)宏,因为它必须在*.def文件中使用重整名称,并且在那里维护那些看起来很丑陋的名称是一项繁琐的任务。但是我们仍然怀疑使用 *.def 文件而不是 __declspec(dllexport) 宏进行函数导出是否有任何好处。

感谢您的建议!

根据MSDN:https://msdn.microsoft.com/en-us/library/hyx1zcd3.aspx,有四种方法可以导出定义,按建议的顺序列出:

  1. 源代码中的 __declspec(dllexport) 关键字
  2. .DEF 文件
  3. 链接命令中的/EXPORT 规范
  4. 源代码中的注释指令,格式为 #pragma
  5. 注释(链接器, "/导出: definition
  6. ")

的优点。DEF 文件如下:

  1. 您可以按序号导出

的缺点。DEF 文件是:

  1. 您有一个额外的文件要维护
  2. 您必须使用修饰的函数名称

按序号导出的优点是可以减小导出表的大小。但是,您必须使用序号而不是友好名称。

.

def文件可以按序号值(@1,@2,...)而不是按名称导出。这可以:

  1. 提高符号查找性能
  2. 保持落后与已发布的 DLL 的兼容性,即序号添加新 API 时,旧 API 的编号保持不变。

并且可以避免函数名称被修饰,从而提高编译器兼容性(即调用约定__stdcall和__cdecl的差异)。下面是在 dll 中导出未修饰的名称的示例。

Def 文件是更好的解决方案。帮助避免大量部署和向后兼容性问题。此外,从代码维护的角度来看也更容易,因为您可以在一个地方看到所有导出。通过在函数声明中添加外部"C",可以轻松避免"重整名称"问题。另一个注意事项是,declspec export 导出名称为 mangled(第三方使用者)的函数需要使用与您使用的完全相同的编译器和/或 .get lib 文件,这些文件与您的链接器 coupled.to