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

C++ 在源文件(VC+;+;)中定义时未导出DLL方法,c++,visual-c++,dll,dllexport,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:

我有一个与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);  
}

当您在头中编写代码时,它可以工作,因为调用是内联的,因此它从不去DLL搜索它

您可以使用基本实用程序检查是否导入/导出了测试函数:

无论如何,您正在通过复制将
std::vector
传递到DLL。因此,使用Distabl和EXE编译和链接使用<强> > <>强>相同的C++标题、库、编译器版本和编译器选项。p> 如果您不遵循此规则,例如,DLL是debug,EXE是release,那么您将得到非常奇怪的效果:随机损坏、崩溃等


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

当您在头中编写代码时,它可以工作,因为调用是内联的,因此它永远不会到DLL中搜索它

您可以使用基本实用程序检查是否导入/导出了测试函数:

无论如何,您正在通过复制将
std::vector
传递到DLL。因此,使用Distabl和EXE编译和链接使用<强> > <>强>相同的C++标题、库、编译器版本和编译器选项。p> 如果您不遵循此规则,例如,DLL是debug,EXE是release,那么您将得到非常奇怪的效果:随机损坏、崩溃等


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

首先,您可能需要通过引用传递
INIVATOR
std::vector&
。但是在导出的函数中传递模板类可能是个坏主意。我不会这么做的。跨模块边界传递模板类只是自找麻烦;如果它能工作,我会更惊讶。首先,您可能需要通过引用传递
INIVATOR
std::vector&
。但是在导出的函数中传递模板类可能是个坏主意。我不会这么做的。跨模块边界传递模板类只是自找麻烦;如果它能起作用,我会更惊讶。感谢Rodrigo等人提供的宝贵答案。通过引用传递向量绝对有效!编译器选项不完全相同,因为VC++强制使用它(例如,DLL应具有_stdcall,而main应具有_cdecl调用约定)。感谢Rodrigo等人提供的宝贵答案。通过引用传递向量绝对有效!编译器选项不完全相同,因为VC++强制使用它(例如,DLL应具有_stdcall,而main应具有_cdecl调用约定)。
EDITED: This only happens when the method uses the stl (e.g. std::vector, std::string)