【发布时间】:2020-11-27 16:44:13
【问题描述】:
使用 Visual Studio 2017,我正在尝试构建我的最新项目,该项目导入库,然后从 .dll 文件导入方法和函数。
在构建我的项目时,我得到如下错误列表:
error LNK2001: unresolved external symbol "__declspec(dllimport) void __cdecl UserTracking(void *)" (__imp_?UserTracking@@YAXPEAX@Z)
error LNK2001: unresolved external symbol "public: bool __cdecl EACServer::Destroy(void)const " (?Destroy@EACServer@@QEBA_NXZ)
error LNK2001: unresolved external symbol "public: bool __cdecl EACServer::Initialize(void)const " (?Initialize@EACServer@@QEBA_NXZ)
...
列出的所有函数都来自导入的库。
例如,EACServer::Initialize 方法在EACServer.h 中是这样定义的:
bool Initialize() const;
在我正在编译的代码中,这个函数是这样使用的(在.h文件ofc中导入了相应的头文件):
this->eacServer = EACServer();
this->eacServer.Initialize();
EACServer的类定义是基本的:
class EACServer : IRoot {
...
}
我被告知抛出这些错误是因为我缺少正确设置 __declspec 的宏。
如何找到/实现这个宏?
【问题讨论】:
-
除非您发布声明缺失函数的代码,否则无法回答这个问题(甚至无法确认您的理论是否正确)。你如何在你的代码中声明
UserTracking?大概你包含了一个头文件,然后查看那个头文件,找到UserTracking的声明并在这里发布。 -
当然,您遇到这些错误的原因还有很多。你给出的理由不是不可能,但会很不寻常。
-
@john 嗨,谢谢 - 我添加了 UserTracking 的函数定义作为示例
-
所以既然我们现在谈论的是类方法,任何宏的使用都将在头文件中的类定义之前,例如
class SOMETHING EACServer ...,这是我感兴趣的部分。 -
好吧,如果不查看所有代码,很难确定,但您的代码似乎缺少从 DLL 导入/导出函数的常用宏。通常有一个宏可以以两种方式定义,一种是导出函数的方式(这是您在编译 DLL 时使用的方式),另一种是导入函数的方式(这是使用 DLL 的代码所具有的方式)。请参阅此处了解更多详情docs.microsoft.com/en-us/cpp/cpp/…
标签: c++ visual-studio dll declspec