【问题标题】:How to define macro which correctly sets the __declspec如何定义正确设置 __declspec 的宏
【发布时间】: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


【解决方案1】:

事实证明,虽然我在链接器附加库目录中添加了我的库的路径,但我忽略了在链接器附加依赖项中添加 .lib 文件。

【讨论】:

  • @Red.Wave 我会尽快系统让我谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-11
  • 2018-12-26
  • 1970-01-01
  • 2022-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多