【发布时间】: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