在C ++中,“ __ declspec(dllexport)类class_name”和“类__declspec(dllexport)类class_name”有什么区别

时间:2018-12-21 19:25:54

标签: c++ dllimport

class __declspec(dllexport) class_name__declspec(dllexport) class class_name之间有区别吗?

我知道这似乎很奇怪。但是我的代码发生了一件奇怪的事情。 首先,我在Visual Studio 2017中打开c ++ Dll项目并像往常一样添加一个类。编译过程很好。但是,当我使用另一个控制台使用Dll时,链接过程告诉我,引用了未解析的外部符号。最让我感到困惑的是,我的新类的构造函数和析构函数是那些缺少的符号。在这里,我使用隐式声明的默认构造函数和析构函数。

我试图显露构造函数和析构函数,但是它不起作用,仍然告诉我错过了这两个函数。

我试图检查调用约定。 dll和控制台都设置为__cdecl,我相信这不是原因。

我想我的“ #include”出了点问题。我尝试过,但是没有发生任何事情。

我不小心交换了班级名称的顺序,结果是正确的。

现在,我对__declspec(dllexport)感到非常困惑。如果两者没有区别,该怎么解释?

请注意,我在预处理器定义中定义了PATHPLANNINGLIB_EXPORTS宏。

#ifdef PATHPLANNINGLIB_EXPORTS
#define PATHPLANNINGLIB_API __declspec(dllexport)
#else
#define PATHPLANNINGLIB_API __declspec(dllimport)
#endif

namespace CCSP_PlanningAlgorithm
{  
using PathMap = std::map<SERobot*, std::vector<WayPoint>>;  

//PATHPLANNINGLIB_API class MOutput  //sucess declartion  
class PATHPLANNINGLIB_API MOutput    //failed declartion, why??  
{  
public:  
  long path_result_ID;  
  PathMap path_map;  
};  
}//CCSP_PlanningAlgorithm  

我希望一切都会好起来。我只使用此类保存最终数据结果。但是链接过程失败,并且我无法运行程序。

测试控制台程序给了我这个错误消息:

LNK2019 无法解析的外部符号 "__declspec(dllimport) public: __cdecl CCSP_PlanningAlgorithm::MOutput::MOutput(void)" (__imp_??0MOutput@CCSP_PlanningAlgorithm@@QEAA@XZ),该符号在函数 "public: static void __cdecl MyTestCase::myStaticTest(void)" (?myStaticTest@MyTestCase@@SAXXZ) 

0 个答案:

没有答案