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)