【问题标题】:.def file vs. __declspec(dllexport) macro.def 文件与 __declspec(dllexport) 宏
【发布时间】:2022-03-02 21:14:58
【问题描述】:

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

感谢您的建议!

【问题讨论】:

标签: c++ dllexport


【解决方案1】:

根据 MSDN: https://msdn.microsoft.com/en-us/library/hyx1zcd3.aspx,导出定义有四种方式,按推荐顺序列出:

  1. 源代码中的 __declspec(dllexport) 关键字
  2. .DEF 文件中的 EXPORTS 语句
  3. LINK 命令中的 /EXPORT 规范
  4. 源代码中的注释指令,格式为#pragma
  5. 评论(链接器,“/export:definition”)

.DEF 文件的优点如下:

  1. 可以按序号导出

.DEF 文件的缺点是:

  1. 您还有一个文件需要维护
  2. 你必须使用修饰函数名

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

【讨论】:

    【解决方案2】:

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

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

    并且可以避免函数名被修饰,提高编译器兼容性(即__stdcall和__cdecl的调用约定不同)。 这里是an example 在 dll 中导出未修饰的名称。

    【讨论】:

      【解决方案3】:

      Def 文件是更好的解决方案。帮助避免大量部署和向后兼容性问题。从代码维护的角度来看,也更容易,因为您可以在一个地方看到所有导出。通过在函数声明中添加 extern "C" 可以轻松避免“修改名称”问题。 另一个考虑因素是 declspec export 导出名称为 mangled 的函数,第三方使用者将需要使用与您使用的完全相同的编译器,和/或获取与链接器紧密耦合的 lib 文件。

      【讨论】:

        猜你喜欢
        • 2023-01-26
        • 2018-08-05
        • 1970-01-01
        • 2015-02-24
        • 2016-02-18
        • 2016-03-25
        • 2011-11-23
        • 2012-07-16
        • 2012-04-14
        相关资源
        最近更新 更多