“未解决的外部符号”错误的奇怪行为

时间:2011-08-12 13:05:19

标签: c++ visual-studio linker

在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);

但奇怪的是,我没有为registerWindow函数获得类似的链接器错误,该函数在与isRegsteredWindow()相同的文件中定义。实际上,如果我对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文件包含在生成错误的文件的顶部。

2 个答案:

答案 0 :(得分:0)

提示:

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

尝试在此函数中添加一些错误,并查看它是否实际上是在第一时间编译的。

答案 1 :(得分:0)

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

这些是一些可能性:

  1. 可能是因为OnlinePokerClient.cpp文件的对象文件没有链接到最终的可执行文件。

  2. 可能是你的'makefile'没有编译OnlinePokerClient.cpp本身。

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