在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文件包含在生成错误的文件的顶部。
答案 0 :(得分:0)
提示:
#if
/ #ifdef
没有省略编译中的这些代码行。class __declspec(dllexport) TheClass
表示法导出整个类。#if
内容不会被排除在编译之外。使用Dependency Walker检查函数是否实际从DLL导出。尝试在此函数中添加一些错误,并查看它是否实际上是在第一时间编译的。
答案 1 :(得分:0)
由于isRegisteredWindow()
函数在OnlinePokerClient.h头文件中声明,然后在相应的OnlinePokerClient.cpp中定义。
这些是一些可能性:
可能是因为OnlinePokerClient.cpp文件的对象文件没有链接到最终的可执行文件。
可能是你的'makefile'没有编译OnlinePokerClient.cpp本身。
您在项目设置中未包含的其他目录/文件夹中是否有OnlinePokerClient.cpp?