在Visual Studio DLL项目和导出类/函数中链接.lib

时间:2015-01-23 23:58:13

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

我有一个可视化工作室项目,它输出一个静态库,为了我的目的,我想保留这个项目。但我也想要一个带有静态lib导出的许多类的dll,所以在C#app中我可以导入dll并使用导出的函数。

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

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

2 个答案:

答案 0 :(得分:1)

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

很多时候你会看到项目有一个宏定义,有一些变体:

#define DllExport __declspec( dllexport )

Here's an article from MSDN

一个例子:

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

class DllExport Foo
{
  // ...
};

答案 1 :(得分:1)

正如在另一个答案中所说,您可以使用__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#调用。

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