C++ 在源文件(VC+;+;)中定义时未导出DLL方法
我有一个与VC++中的DLL链接的主程序。事实证明,如果我在头文件DLL之外声明类方法,所有的编译和链接都会很好,但是Main无法访问它们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:
//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)