【问题标题】:"unresolved external symbol" error strange behavior“未解析的外部符号”错误奇怪的行为
【发布时间】:2011-08-12 13:05:19
【问题描述】:

在 Visual Studio 2008 中编译 C++ 项目时,出现以下链接器错误:

unresolved external symbol "public: bool __thiscall OnlinePokerClient::isRegisteredWindow(struct HWND__ *)" (?isRegisteredWindow@OnlinePokerClient@@QAE_NPAUHWND__@@@Z) referenced in function "long __stdcall CBTProc(int,unsigned int,long)" (?CBTProc@@YGJHIJ@Z)

产生错误的代码是这样的:

if (!g_pClient->isRegisteredWindow(hWnd))
        g_pClient->registerWindow(hWnd, NULL);

不过,奇怪的是,对于与 isRegsteredWindow() 在同一个文件中定义的 registerWindow 函数,我没有收到类似的链接器错误。事实上,如果我对 isRegisteredWindow() 的调用进行注释,项目编译就好了。

我想我可能搞砸了一些链接器设置。我是 Visual Studio 的新手,在尝试编译由两个项目组成的解决方案时遇到此错误:第一个是 DLL 库,而另一个是使用 MFC 的 GUI。 DLL 被编译和链接得很好,GUI 被编译但是我在链接阶段得到这个错误,即使这些代码行包​​含在第一个(DLL 之一)项目中。

有什么帮助吗?

添加

isRegisteredWindow() 函数在 OnlinePokerClient.h 头文件中声明,然后在相应的 OnlinePokerClient.cpp 文件中定义。这是函数本身:

bool OnlinePokerClient::isRegisteredWindow(HWND hWnd) {
    map<HWND, OnlineTableWindow*>::const_iterator iter = tables.find(hWnd);

    return iter != tables.end();
}

当然 OnlinePokerClient.h 文件包含在生成错误的文件之上。

【问题讨论】:

  • 您能否在代码中显示 isRegisteredWindow 的定义及其位置?
  • 好吧,链接器找不到 isRegisteredWindow 函数。这个函数在哪里?在 DLL 中?如果是这样,您应该加载它。
  • 编辑了原始问题以添加一些细节
  • 并且 OnlinePokerClient.cpp 已添加到项目中(并且未从构建中排除)?
  • 是否为这个 dll 生成了 .lib?你确定这个函数的代码真的被编译了吗?例如,我曾经添加了一个新项目并选择 .h 而不是 .cpp。重命名文件并不意味着VS会自动将其包含在编译中,因此您可以检查您的dll编译时是否表示该文件已在其中编译。

标签: c++ visual-studio linker


【解决方案1】:

提示:

  • 如果函数被定义为内联,请尝试重建整个解决方案。
  • 如果函数是在 CPP 中实现的,请确保 #if/#ifdef 没有在编译中省略这些代码行。
  • 如果此类在 DLL 中,请确保使用 class __declspec(dllexport) TheClass 表示法导出整个类。
  • 除上述之外,确保#if 的东西不排除它被编译。使用 Dependency Walker 检查函数是否实际上是从 DLL 导出的。

尝试在这个函数中添加一些错误,看看它是否真的首先被编译。

【讨论】:

    【解决方案2】:

    因为isRegisteredWindow() 函数在 OnlinePokerClient.h 头文件中声明,然后在对应的 OnlinePokerClient.cpp 中定义。

    以下是几种可能性:

    1. 可能是 OnlinePokerClient.cpp 文件的 object 文件没有链接到您的最终可执行文件。

    2. 可能是您的“makefile”没有编译 OnlinePokerClient.cpp 本身。

    3. OnlinePokerClient.cpp 是否在您的项目设置中未包含的其他目录/文件夹中?

    【讨论】:

      猜你喜欢
      • 2014-07-26
      • 2013-11-01
      • 2012-10-17
      • 2011-11-29
      • 2012-10-31
      • 2012-08-31
      相关资源
      最近更新 更多