在源文件中定义时未导出的DLL方法(VC ++)

时间:2011-12-23 11:21:19

标签: c++ visual-c++ dll dllexport

我有一个主程序链接VC ++中的DLL。事实证明,如果我在头文件DLL之外声明类方法,所有编译和链接都很好,但是Main无法访问它们。

//mydll.h 
#if XXX_EXPORTS
#define CLASS_DECLSPEC __declspec(dllexport)
#else
#define CLASS_DECLSPEC __declspec(dllimport)
#endif


class CLASS_DECLSPEC COrbitPropagator
{
public:
  int test(double initime, std::vector<double> inivector);  
}

如果我在头文件中定义 test 方法(内联或在此声明下面),则Main工作。但是,如果我在.cpp源文件中定义此方法,则在调用此方法时Main将失败并打印此消息:

  

HEAP [Main.exe]:为RtlFreeHeap指定的无效地址(003A0000,   003C2CE8)

两个运行时(dll和main)都设置为Debug Multi-threaded DLL,但我尝试过其他组合。有什么解决方案吗?我想避免在头文件中写下我的所有DLL代码!

EDITED: This only happens when the method uses the stl (e.g. std::vector, std::string)

1 个答案:

答案 0 :(得分:3)

当您在标头中编写代码时,它的工作原理是因为调用是内联的,因此它永远不会转到DLL来搜索它。

您可以使用基本实用程序检查是否导入/导出测试功能:Dependency Walker

无论如何,您正在通过复制将std::vector 传递给DLL。因此,必须使用完全相同的C ++头文件,库,编译器版本和编译器选项来编译和链接DLL和EXE。

如果您不遵循此规则,例如,DLL是调试并且EXE正在发布,那么您将获得非常奇怪的效果:随机损坏,崩溃等。

如果需要混合使用不同编译的DLL和EXE,则必须严格限制接口(没有交叉动态内存的普通C)。