【问题标题】:Link .lib in Visual Studio dll project and export classes/functions在 Visual Studio dll 项目中链接 .lib 并导出类/函数
【发布时间】:2015-01-24 08:29:17
【问题描述】:

我有一个输出静态库的 Visual Studio 项目,出于我的目的,我想保留这个项目。但我也想要一个包含静态库中的许多类的 dll,因此在 C# 应用程序中我可以导入 dll 并使用导出的函数。

我创建了一个应用程序类型为 dll 的控制台应用程序,并且我引用了 lib。一切似乎都构建得很好,但是当我在 dll 上运行 dumpbin 时,什么都没有导出。

我的问题是如何导出库中的类?

【问题讨论】:

    标签: c++ visual-studio-2012 visual-studio-2013


    【解决方案1】:

    您需要在类定义中使用 _declspec(export) 关键字。

    很多时候,您会看到项目有一个宏定义,其中包含以下变体:

    #define DllExport __declspec( dllexport )

    Here's an article from MSDN.

    一个例子:

    class __declspec( dllexport ) Foo
    {
     // ...
    };
    

    或者

    class DllExport Foo
    {
      // ...
    };
    

    【讨论】:

    • 我已经做到了。我已将此添加到 lib 中的 MyClass.h 中,并在我的 dll 项目中引用了该 lib。但是当我构建 MyClass 时没有导出。
    • 作为健全性检查,它会在您构建 DLL 时生成 .obj 文件?
    • 是的,它正在构建该文件。
    【解决方案2】:

    正如在另一个答案中所说,您可以使用 __declspec 从 DLL 导出 C++ 类,但这听起来不是您需要的,因为您说您想从 C# 使用这个库,它不懂 C++ 类,使用 P/Invoke 会很尴尬,因为方法名称会被破坏。

    从 C# 访问 C++ 类的一些更简单的选项:

    1. 您可以将 C++ 库构建为 CLR 类库,并使用 .NET 类封装 C++ 类,然后在 C# 项目中引用该类库。

    2. 您可以使用 Swig 围绕您的 C++ 代码生成 C# 包装器。

    3. 您可以使用一组 C 函数封装您的 C++ 类,您可以使用 __declspec(dllexport) 从 DLL 导出这些函数,并使用 P/Invoke 从 C# 调用。

    如果您确实想从 DLL 中导出 C++ 类,我建议您将构建配置添加到您现有的静态库项目中,可能称为“DLL 调试”和“DLL 发布”,并更改这些构建的设置构建为 DLL 的配置,因为听起来目前您只是将 DLL 链接到静态库,而不是导出静态库中的内容。

    【讨论】:

      猜你喜欢
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 2011-12-12
      • 2011-06-06
      • 2014-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多