我正在使用教程中的代码库来提供将非静态成员函数的函数点传递给需要静态函数指针的函数的功能,这可能有助于知道我在起诉什么,所以这里是链接http://www.codeproject.com/KB/cpp/thunk32.aspx此代码使用Boost库,我已经下载并设置了或多或少的所有内容。
在Thunk库中,其中一个头文件有一个读取
的部分#define BOOST_PP_ITERATION_PARAMS_1 (3,(0,THUNK32_MAX_ARGS,"Thunk32_template.h"))
??=include BOOST_PP_ITERATE()
#undef BOOST_PP_ITERATION_PARAMS_1
但这给了我大量的错误,我可以通过将其更改为
来解决#define BOOST_PP_ITERATION_PARAMS_1 (3,(0,THUNK32_MAX_ARGS,"Thunk32_template.h"))
#include BOOST_PP_ITERATE()
#undef BOOST_PP_ITERATION_PARAMS_1
下载的代码作为第二个项目包含在我的解决方案中,可以快速编译和构建。但是我使用此代码的项目存在链接问题,为了节省人们的询问,我收到了这些错误消息
1>WebCamera.obj : error LNK2019: unresolved external symbol "protected: __thiscall indev::Thunk32Base::Thunk32Base(void)" (??0Thunk32Base@indev@@IAE@XZ) referenced in function "public: __thiscall indev::Thunk32<class WebCamera,void __cdecl(struct HWND__ *,struct videohdr_tag *)>::Thunk32<class WebCamera,void __cdecl(struct HWND__ *,struct videohdr_tag *)>(void)" (??0?$Thunk32@VWebCamera@@$$A6AXPAUHWND__@@PAUvideohdr_tag@@@Z@indev@@QAE@XZ)
1>WebCamera.obj : error LNK2019: unresolved external symbol "protected: __thiscall indev::Thunk32Base::~Thunk32Base(void)" (??1Thunk32Base@indev@@IAE@XZ) referenced in function "public: __thiscall indev::Thunk32<class WebCamera,void __cdecl(struct HWND__ *,struct videohdr_tag *)>::~Thunk32<class WebCamera,void __cdecl(struct HWND__ *,struct videohdr_tag *)>(void)" (??1?$Thunk32@VWebCamera@@$$A6AXPAUHWND__@@PAUvideohdr_tag@@@Z@indev@@QAE@XZ)
1>WebCamera.obj : error LNK2019: unresolved external symbol _capCreateCaptureWindowA@32 referenced in function "public: bool __thiscall WebCamera::Init(struct HWND__ *)" (?Init@WebCamera@@QAE_NPAUHWND__@@@Z)
我认为这是试图说没有声明构造函数和析构函数,而且我的WebCamera.Init()也搞砸了。我确保Thunk32项目导出的库包含在我的其他项目中,但我仍然遇到这些错误。
我想知道我是否已经做出了??=include
应该更改为#include
的正确假设,如果我有,我做错了什么或者没有做到这一点会导致这些链接器错误。或者,如果你能为我提供一种不同的方法,可以将一个函数指针传递给一个非常棒的非静态成员函数。
由于
答案 0 :(得分:3)
??=
是#
字符的“三字母”序列。根据标准,三元组应该作为处理的第一步处理(在第1阶段 - 在预处理器处理指令之前),所以:
??=include "whatever"
应该相当于:
#include "whatever"
所以你应该能够使用那种形式(我想知道为什么三卦一开始就放在那里 - 也许某种邪恶的笑话?)
然而,三字母导致问题和混乱(可能比他们帮助更多),因此编译器似乎正在向他们发出警告和/或默认不处理它们。 VS 2010中的编译器默认关闭三元组处理 - 您必须使用/Zc:trigraphs
选项将其打开。
有关详细信息,请参阅Purpose of Trigraph sequences in C++?。
答案 1 :(得分:2)
Anyhoo,没什么复杂的,你只是忘了告诉链接器查看一些库。右键单击项目“项目依赖项”,勾选“Thunk”项目。这确保了Thunk32.lib可以查看并解析ctor和dtor。
再次右键单击“属性”,“链接器”,“其他依赖项”,添加“winmm.lib”。这解析了capCreateCaptureWindow符号。
答案 2 :(得分:0)
您是否在indev :: Thunk32Base类中声明了构造函数和析构函数,而您忘记在其cpp文件中定义它?
答案 3 :(得分:0)
好的,所以我现在设法解决了这个问题。
Michael Burr nicley说??=
基本上与键入#
相同,但是没有哈希符号的用户可以键入它,请参阅Purpose of Trigraph sequences in C++? < / p>
Hans Passant然后让我滚球让我知道我没有完全联系起来。我需要右键单击我的主项目,选择'Project Dependencies'并选择我的其他具有thunk32代码的项目。我还需要告诉我的主项目查看Thunk项目保存lib的位置,结果是在我的文档中的一个文件夹中(解释那个!)。我还需要添加Thunk32d.lib(注意'd',因为我处于调试模式.Hans说我需要winmm.lib
但事实证明(当谷歌搜索给我错误的函数时)我需要Vfw32.lib
代替。
谢谢你们!我希望通过给出这样的完整答案,它可以帮助其他有类似问题的人。