.def 文件与 __declspec(dllexport) 宏
.def file vs. __declspec(dllexport) macro
我们的团队正在考虑从def文件迁移到__declspec(dllexport)宏,因为它必须在*.def
文件中使用重整名称,并且在那里维护那些看起来很丑陋的名称是一项繁琐的任务。但是我们仍然怀疑使用 *.def 文件而不是 __declspec(dllexport) 宏进行函数导出是否有任何好处。
感谢您的建议!
根据MSDN:https://msdn.microsoft.com/en-us/library/hyx1zcd3.aspx,有四种方法可以导出定义,按建议的顺序列出:
- 源代码中的 __declspec(dllexport) 关键字
- .DEF 文件
- 链接命令中的/EXPORT 规范
- 源代码中的注释指令,格式为 #pragma
- 注释(链接器, "/导出:
definition
")
的优点。DEF 文件如下:
- 您可以按序号导出
的缺点。DEF 文件是:
- 您有一个额外的文件要维护
- 您必须使用修饰的函数名称
按序号导出的优点是可以减小导出表的大小。但是,您必须使用序号而不是友好名称。
.
def文件可以按序号值(@1,@2,...)而不是按名称导出。这可以:
- 提高符号查找性能
- 保持落后与已发布的 DLL 的兼容性,即序号添加新 API 时,旧 API 的编号保持不变。
并且可以避免函数名称被修饰,从而提高编译器兼容性(即调用约定__stdcall和__cdecl的差异)。下面是在 dll 中导出未修饰的名称的示例。
Def 文件是更好的解决方案。帮助避免大量部署和向后兼容性问题。此外,从代码维护的角度来看也更容易,因为您可以在一个地方看到所有导出。通过在函数声明中添加外部"C",可以轻松避免"重整名称"问题。另一个注意事项是,declspec export 导出名称为 mangled(第三方使用者)的函数需要使用与您使用的完全相同的编译器和/或 .get lib 文件,这些文件与您的链接器 coupled.to
相关文章:
- DLL:当 SDK 头文件不使用 __declspec(dllexport) 时,我可以使用它吗
- DLLexport 类模板实例(专用化),减少了仅标头模板库的编译时间
- Clang 是否可以在使用可见性属性时生成导入库(不带 __declspec(dllexport))?
- 为什么MSVC(Visual C++)需要单独的dllimport和dllexport属性,而gcc不需要
- 使用 dllimport 代替 dllexport
- 如何在结构定义中组合__attribute__((dllexport))和[[nodiscard]]?
- C ++:DECLSPEC,静态库和DLL
- VC 链接器错误使用Dllimport/DLLEXPORT宏将标题包括在多个项目中
- 如何使用ctypes将类对象从c ++(DllExport)返回到python,反之亦然
- 使用 dllexport 传递 std::string
- Using __declspec( dllexport )
- 'ShowSUM':__declspec(dllexport)不能应用于具有__clrcall调用约定的函数
- 如何基于每个成员覆盖类范围的__declspec(dllexport)注释?
- 使用__declspec(dllexport)从DLL导出函数
- C++ [[gnu::visibility( "default" )]] vs __declspec(dllexport) on Windows 和 Linux
- 尽管使用了正确的dllExport-Visual Studio,但没有函数导出到DLL中
- 是否可以在程序集中编写dllexport(然后是dllimport)函数
- Inline and dlimport/dllexport
- C#:Cdecl-DllExport,参数中有一个指向类实例的指针
- 当在导入函数之前添加__declspec(dllexport)时,它会做什么