Windows XP上的TBB(在OpenCV中使用)-错误入口点initializeccriticalsectione
TBB on Windows XP (using in OpenCV) - error entry point InitializeCriticalSectionEx
我试图编译我想在OpenCV上使用的TBB。我使用的是Windows XP和Visual Studio 2010 c++。当我编译TBB 4.4时,我得到了错误
"过程入口点InitializeCriticalSectionEx无法在动态链接库KERNEL32.dll中找到。"
错误是类似的,但在不同的条件下,如以下:
http://answers.opencv.org/question/6151/opencv_createsamplesexe-entry-point-problem-with-xp/在我的情况下,我根本不能运行程序。我尝试了那里描述的解决方案,所以我将InitializeCriticalSectionEx重命名为InitializeCriticalSection,并删除了参数2和3。
OpenCV声称这个bug不在他们这边。我知道OpenCV使用这个:
#if (_WIN32_WINNT >= 0x0600)
InitializeCriticalSectionEx(&cs, 1000, 0);
#else
InitializeCriticalSection(&cs);
#endif
我知道这应该不会造成任何问题,但我注释了一些行来保持initializeccriticalsection (&cs);只有。我重新编译了OpenCV,仍然是相同的错误。最后我发现在TTB:tbb44_20160627oss tbb 机包括 windows_api.h
__TBB_WINBASEAPI BOOL WINAPI TryEnterCriticalSection( LPCRITICAL_SECTION );
__TBB_WINBASEAPI BOOL WINAPI InitializeCriticalSectionAndSpinCount( LPCRITICAL_SECTION, DWORD );
// Overloading WINBASEAPI macro and using local functions missing in Windows XP/2003
#define InitializeCriticalSectionEx inlineInitializeCriticalSectionEx
我还在opencv_core310.dll和opencv_core310.dll中找到了"InitializeCriticalSectionEx"一词。重载是否真的有效,为什么我得到了错误?我怎样才能修好它呢?
更新:OpenCV中的定义
#ifndef _WIN32_WINNT // This is needed for the declaration of TryEnterCriticalSection in winbase.h with Visual Studio 2005 (and older?)
#define _WIN32_WINNT 0x0400 // http://msdn.microsoft.com/en-us/library/ms686857(VS.85).aspx
#endif
"程序入口点InitializeCriticalSectionEx无法在动态链接库KERNEL32.dll中找到。"
这是一个标准错误,当你试图运行一个包含静态绑定调用的程序时,Windows会显示一个不存在的DLL函数。
InitializeCriticalSectionEx函数在Windows XP中不可用,但是您拥有的库版本包含调用该函数的代码。
OpenCV的解决方案是一个编译时解决方案。它在编译库时确定目标是哪个版本的Windows,并使用该信息生成对适当版本的函数的调用。OpenCV声称这个bug不在他们这边。我知道OpenCV使用这个:
#if (_WIN32_WINNT >= 0x0600) InitializeCriticalSectionEx(&cs, 1000, 0); #else InitializeCriticalSection(&cs); #endif
在你的情况下,有两种可能的原因:
你正在使用二进制形式的OpenCV库,并且你已经编译了针对Windows Vista和更高版本的二进制文件。您可以通过获取OpenCV的源代码并自己编译它来解决这个问题,无论是作为DLL还是静态库。
您正在编译
_WIN32_WINNT
设置为0x0600
或更高版本。默认情况下,Windows头文件将此符号定义为最新可用版本。如果需要,必须显式地定义较早的目标版本。要安排目标Windows XP,在代码文件的顶部添加以下代码(可能在预编译的头文件中):#include <WinSDKVer.h> #define _WIN32_WINNT _WIN32_WINNT_WINXP #include <SDKDDKVer.h>
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- SWIG c++ 到 C# 错误找不到入口点SWIGRegisterExceptionCallbacks_xxxx
- 初学者问题 - 致命错误LNK1561:必须定义入口点
- DirectX 11.2 错误: X3501: 找不到'main'入口点
- 在Vista操作系统中找不到入口点错误
- 致命错误LNK1561 - 必须定义入口点
- SFML 错误,出现C++,找不到入口点
- sdl_ttf iOS错误的入口点
- 链接:致命错误LNK1561:必须定义VS2015开发者cmd窗口的入口点
- 在动态链接库libstdc++-6.dll中找不到过程入口点_gxx_personality_v0.错误
- 错误LNK1561:必须定义入口点
- 过程入口点无法在动态链接库中找到-查找错误的DLL
- 64位代码洞返回错误的入口点位置
- 为什么我得到这个简单的c++代码的过程入口点错误
- SDL2_ttf错误:没有找到入口点
- 使用OpenCV和VLC SDK的函数入口点出现奇怪错误
- 在哪里设置着色器文件的入口点(错误X3501)
- Windows XP上的TBB(在OpenCV中使用)-错误入口点initializeccriticalsectione