【问题标题】:Export function from DLL in Visual Studio 2010 using DEF使用 DEF 从 Visual Studio 2010 中的 DLL 导出函数
【发布时间】:2013-01-02 08:52:04
【问题描述】:

我继承了 巨大的 C++ 多项目解决方案,其中包含许多动态库但没有任何

__declspec(dllexport)

learned 不一定要插入任何 dllexport (工作量很大),但是除了相应的文件之外,还可以使用 .def 文件.dll 代替。

为了尝试我从here 构建了一个“DLL Hello World”项目,从标题中删除了 dllexport 并且......拼命失败。用已经cited页面的话来说,我的关键问题是如何

"[..] use the .def file when building the DLL."

我的 .def 文件是(我只使用 Add 方法尝试代码):

LIBRARY   MathFuncsDll
EXPORTS 
?Add@MyMathFuncs@MathFuncs@@SANNN@Z

在 Visual Studio 2010 中构建 DLL 以导出 Add 方法时如何使用它?

【问题讨论】:

  • 你能把原型展示给你的Add函数吗?
  • static double Add(double a, double b);,作为 public 放置在命名空间 MathFuncs 的类 MyMathFuncs
  • 您要导出课程吗?见stackoverflow.com/questions/186232/…
  • 不,不过还是谢谢你的提示。
  • Win32 的GetWindowText() 是从 DLL 导出的“纯 C 接口”函数的示例。你使用extern "C",你不在接口处使用C++对象,你不在函数外抛出C++异常等等。(实现可以是C++,但是接口是纯C的。)但是看起来你想要导出一个 C++ 类(静态)方法...

标签: c++ visual-studio-2010 dll


【解决方案1】:

在这个问题面前过了半天,我才找到解决办法:描述为here

用我自己的话来恢复.def文件在VS2010中导出符号的过程

  1. 告诉VS2010编译一个动态库(.dll)。这是在图书馆项目的属性页中完成的。
  2. 使用mangled (decorated) names 创建一个模块定义文件(.def)(至少当您的语言是C++ 时)。如果您使用dllexport,您可以将您的.dll 的已导出符号显示为described here。如果您还没有导出任何内容,请参阅 this 帖子。
  3. 将 .def 添加到其属性页中的库定义中。
  4. 编译
  5. 验证您工作的正确性,例如通过打开依赖文件使用Dependency Walker,例如.exe。您应该在依赖文件下方的依赖树中看到刚刚编译的库。不应有错误或警告,例如没有红色

如果您对 .def 文件还有其他疑问,请查看终点“模块定义文件”

【讨论】:

  • __declspec 的全部意义在于您不必执行 2、3 和 5。如果您想重命名导出,您只需要真正使用 .def 文件.
  • 在我的例子中,我不愿意在已有代码的数百个文件中添加 dllexport。特别是因为它将来可能会改变(不是我的改变)。实际上,该代码是为 MinGW 开发的。我的希望在不更改任何代码的情况下自动导出。
  • 这自然会引出下一个明显的问题:如何为任意类和方法确定像?Add@MyMathFuncs@MathFuncs@@SANNN@Z 这样的“mangled”名称?在我的具体情况下,我作弊了:我首先创建了一个 with dllexport 的 .dll,提取了符号,然后使用提取的符号制作了 .def,最后,删除了 dllexport。在一般情况下如何确定重整名称?
  • 对,你完全倒过来了。 dllexport 确保损坏的名称是正确的,即使在更改之后也是如此。您可以使用地图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-23
  • 1970-01-01
  • 1970-01-01
  • 2016-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多