我正在尝试链接到我拥有所有源代码的 dll,但我无法访问我在其中创建的 dirt Simple 类而不获取LNK2019。
我做了这个:
class makeprob
{
public:
makeprob();
~makeprob();
};
随着实施:
makeprob::makeprob() { }
makeprob::~makeprob() { }
作为一个不错的简单模板。 然后在我的实际项目中,我有以下内容:
#include "evil_dll.h"
class PC
{
public:
PC() { };
~PC() { };
static makeprob ProblemCreator;
};
随着实施:
#include "evil_dll.h"
makeprob PC::ProblemCreator;
当我尝试链接到它并构建一个makeprob类时,我得到
LNK2019 unresolved external symbol "public: __thiscall makeprob::makeprob(void)" (??0makeprob@@QAE@XZ) referenced in function "void __cdecl `dynamic initializer for 'public: static class makeprob PC::ProblemCreator''(void)" (??__E?ProblemCreator@PC@@2Vmakeprob@@A@@YAXXZ)
我已经检查了我是否正在链接到库,我是。 据我所知,dll 是与我的 32 位应用程序一起使用的 32 位 dll。 我已经在使用 dll 中的函数,但它们已使用 __declspec(dllimport) 声明
我不得不承认;我对此都持赞同态度。 我不知道我是否应该在接收器上做任何特定的事情来将一个类从 dll 中带到对面。 这是学校测试的一部分,部分说明告诉我不需要编辑源代码(只需使用提供的类)。 我只创建了makeprob类,以使问题易于在此处发布。
任何建议都是无价的! 非常感谢!
Scheff 实际上在上面的评论中回答了这个问题,只是将其形式化为 Stack Overflow,但 Scheff 值得所有酷发型和雷朋太阳镜积分。
我的问题是类实现不导出构造函数或析构函数。 我上面的makeprob头文件应该是这样的:
class makeprob
{
public:
__declspec(dllexport) makeprob();
__declspec(dllexport) ~makeprob();
};
才能访问这些内容。 Scheff 进一步建议为此使用宏(我发现它们已经存在:systemAPI),而不是手动写出它。
这并不能绕过我的教授告诉我不需要编辑源代码,但是由于我导入的类的所有其他函数前面都有systemAPI,只有构造函数和析构函数没有,所以我要称之为疏忽? 除非有一种花哨的方法可以在没有构造函数/析构函数的情况下导入类。
谢谢大家!