Windows XP上的TBB(在OpenCV中使用)-错误入口点initializeccriticalsectione

TBB on Windows XP (using in OpenCV) - error entry point InitializeCriticalSectionEx

本文关键字:错误 入口 initializeccriticalsectione 上的 XP TBB OpenCV Windows      更新时间:2023-10-16

我试图编译我想在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声称这个bug不在他们这边。我知道OpenCV使用这个:

#if (_WIN32_WINNT >= 0x0600)
        InitializeCriticalSectionEx(&cs, 1000, 0);
#else
        InitializeCriticalSection(&cs);
#endif
OpenCV的解决方案是一个编译时解决方案。它在编译库时确定目标是哪个版本的Windows,并使用该信息生成对适当版本的函数的调用。

在你的情况下,有两种可能的原因:

  1. 你正在使用二进制形式的OpenCV库,并且你已经编译了针对Windows Vista和更高版本的二进制文件。您可以通过获取OpenCV的源代码并自己编译它来解决这个问题,无论是作为DLL还是静态库。

  2. 您正在编译_WIN32_WINNT设置为0x0600或更高版本。默认情况下,Windows头文件将此符号定义为最新可用版本。如果需要,必须显式地定义较早的目标版本。要安排目标Windows XP,在代码文件的顶部添加以下代码(可能在预编译的头文件中):

    #include <WinSDKVer.h>
    #define _WIN32_WINNT      _WIN32_WINNT_WINXP
    #include <SDKDDKVer.h>