为什么visual studio 2010在寻找__thiscall而不是__cdecl调用约定?

时间:2012-08-13 13:57:57

标签: c++ visual-studio-2010 opencv linker calling-convention

总的来说,我试图将opencv测试程序与我使用64位visual studio 2010专业版编译的opencv库链接起来。示例错误是:

1>webcamtest.obj : error LNK2001: unresolved external symbol "public: virtual bool __thiscall cv::VideoCapture::isOpened(void)const " (?isOpened@VideoCapture@cv@@UBE_NXZ)

问题是为什么__thiscall,当它与之链接的opencv_highui249.dll包含

Symbol name  : ?isOpened@VideoWriter@cv@@UEBA_NXZ (public: virtual bool __cdecl cv::VideoWriter::isOpened(void)const )

__ cdecl有意义,这表明该库是正确构建的。 在链接测试程序时,正在搜索opencv_highui249.dll,因此构建标志看起来是正确的,但显然我遗漏了什么?

3 个答案:

答案 0 :(得分:1)

您确定使用过x64库吗? Microsoft减少了x64中的调用约定。见here。基本上现在一切都是__fastcall 编译器仍然可以使用__thiscall,但会被忽略(MSDN link)。所以你的测试程序很好,但你的库看起来不对。

答案 1 :(得分:0)

__thiscall是VS中类的成员函数的默认调用约定。也许头文件缺少__cdecl说明符,或者编译标志设置不正确,因此没有设置相关的#define。

答案 2 :(得分:0)

__thiscall是MSVC中类成员函数的默认值,您需要使用相同的设置编译OpenCV,或者在标头定义中明确使用__cdecl