【问题标题】:Linker error. MinGW can't export class from MSVS dll链接器错误。 MinGW 无法从 MSVS dll 导出类
【发布时间】:2016-05-07 13:11:52
【问题描述】:

我使用 MinGw (i686-4.9.2-win32) 并尝试从 dll 导出类(在 Visual Studio 中制作) 但我收到一个错误undefined reference to _imp___ZN11ConsoleTestC1E'

BUT 函数foo() 来自同一个库,没有错误导出..

这是我的代码

testdll.h

#ifdef CONSOLETEST_EXPORT
#define CONSOLETEST_API __declspec(dllexport)
#else
#define CONSOLETEST_API __declspec(dllimport)
#endif

extern "C" class CONSOLETEST_API ConsoleTest{
public:
     ConsoleTest();
};
extern "C" void CONSOLETEST_API foo();

testdll.cpp

#include "testdll.h"
ConsoleTest::ConsoleTest(){}
void  foo(){}

在 main.cpp 中:

 #include "testdll.h"
 int main()
 {
  foo();
  ConsoleTest* cc = new ConsoleTest();
 }

PS:我尝试从 .dll 创建一个 .a 库:

pexports testdll.dll | sed "s/^_//" > testdll.def
dlltool -U -d testdll.def -l testdll.a

...但它没有帮助。

提前感谢您的任何建议!

【问题讨论】:

  • 请注意:由于您使用的是 mingw,因此您不必弄乱 dllimport/dllexport。 Mingw 会像在良好的 ELF 系统上一样自动处理此问题(如果您收到链接器警告,您可以使用 -Wl,--enable-auto-import 选项抑制它)。
  • 谢谢,我不知道!

标签: c++ dll linker mingw


【解决方案1】:

extern "C" class 不起作用。 您可以 dll 导出一个类,但不能使用 C 命名约定。

ISO C++03 7.5[dcl.link]/4:

类成员和成员函数的名称忽略 C 语言链接 类成员函数的类型。

如果您删除 extern "C",我看不出它不起作用的原因。

【讨论】:

  • 谢谢!哦,是的,你是对的,“c”和类 - 我应该知道.. 不,没有 extern“C”,即使函数“foo”也不起作用。无论如何,我还没有找到解决方案,而是走了另一条路。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多