gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 22:50:12 26 4
gpt4 key购买 nike

我尝试编译我想在 OpenCV 上使用的 TBB。我正在使用 Windows XP 和 Visual Studio 2010 C++。当我编译 TBB 4.4 时出现错误

“无法在动态链接库 KERNEL32.dll 中找到过程入口点 InitializeCriticalSectionEx。”

错误是相似的,但在像这里这样的小不同条件下:

http://answers.opencv.org/question/6151/opencv_createsamplesexe-entry-point-problem-with-xp/

在我的情况下,我根本无法运行该程序。我尝试了那里描述的解决方案,所以我将 InitializeCriticalSectionEx 重命名为 InitializeCriticalSection 并删除了参数 2 和 3。

OpenCV 声称错误不在他们这一边。我知道 OpenCV 使用这个:

#if (_WIN32_WINNT >= 0x0600)
InitializeCriticalSectionEx(&cs, 1000, 0);
#else
InitializeCriticalSection(&cs);
#endif

我知道这不会造成任何问题,但我评论了一些行以保留 InitializeCriticalSection(&cs);仅有的。我重新编译了 OpenCV,仍然是同样的错误。最后我在TTB中找到了:tbb44_20160627oss\include\tbb\machine\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_core310d.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

最佳答案

"The procedure entry point InitializeCriticalSectionEx could not be located in the dynamic link library KERNEL32.dll."

这是 Windows 在您尝试运行包含对不存在的 DLL 中函数的静态绑定(bind)调用的程序时显示的标准错误。

InitializeCriticalSectionEx 函数在 Windows XP 上不可用,但您拥有的库版本包含调用此函数的代码。

OpenCV claimes the bug is not on their side. I know OpenCV uses this:

#if (_WIN32_WINNT >= 0x0600)
InitializeCriticalSectionEx(&cs, 1000, 0);
#else
InitializeCriticalSection(&cs);
#endif

OpenCV 的解决方法是编译时 解决方案。它在编译库时确定目标 Windows 版本,并使用该信息生成对函数的适当版本的调用。

在您的案例中,出现这种情况的原因有两种可能:

  1. 您正在使用二进制形式的 OpenCV 库,并且您拥有的二进制文件已针对 Windows Vista 及更高版本进行了编译。您可以通过获取 OpenCV 的源代码并自己将其编译为 DLL 或静态库来解决此问题。

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

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

关于c++ - Windows XP 上的 TBB(在 OpenCV 中使用)- 错误入口点 InitializeCriticalSectionEx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38054603/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com