我有一个主程序链接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)
答案 0 :(得分:3)
当您在标头中编写代码时,它的工作原理是因为调用是内联的,因此它永远不会转到DLL来搜索它。
您可以使用基本实用程序检查是否导入/导出测试功能:Dependency Walker。
无论如何,您正在通过复制将std::vector
传递给DLL。因此,必须使用完全相同的C ++头文件,库,编译器版本和编译器选项来编译和链接DLL和EXE。
如果您不遵循此规则,例如,DLL是调试并且EXE正在发布,那么您将获得非常奇怪的效果:随机损坏,崩溃等。
如果需要混合使用不同编译的DLL和EXE,则必须严格限制接口(没有交叉动态内存的普通C)。