- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个依赖于 OpenCV 和 TBB 的 VS (C++) 项目,所以我为每个库创建了属性表并将它们包含在项目中。一切正常,代码已编译。
昨天,我已经开始使用 vcpkg包管理器。我通过 vcpkg 安装了 OpenCV 和 TBB,一切似乎都正常。我创建了一个空项目,包含两者的头文件并测试新编译的库是否有效。验证后,我返回到我的主项目并删除了属性表,因此我可以使用 vcpkg 中的库。自从上次成功编译以来,我没有以任何方式更改代码。
但是当我现在尝试编译代码时,我两次收到此错误(在 main.cpp 和子模块中)
tbb\critical_section.h(53): error C3861: 'InitializeCriticalSectionEx': identifier not found
最佳答案
我找到了问题的根源,它实际上与 TBB 无关,而是与 Poco library 有关。 .
考虑最小的例子:
#include <Poco/Poco.h>
#include <tbb/tbb.h>
void main()
{
}
#if _WIN32 || _WIN64
#include <windows.h>
#if _WIN32_WINNT < 0x0600
#define InitializeCriticalSectionEx inlineInitializeCriticalSectionEx
inline BOOL WINAPI inlineInitializeCriticalSectionEx( LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount, DWORD )
{
return InitializeCriticalSectionAndSpinCount( lpCriticalSection, dwSpinCount );
}
#endif
_WIN32_WINNT
的支票宏。这个宏在 sdkddkver.h(包含在 windows.h 中)中定义,如果它还没有定义(在我的例子中它设置为 Win10):
#if !defined(_WIN32_WINNT) && !defined(_CHICAGO_)
#define _WIN32_WINNT 0x0A00
#endif
_WIN32_WINNT
宏控制实际包含哪个版本的 Windows 头文件。如
_WIN32_WINNT
设置为比Windows Vista 更早的版本,功能
InitializeCriticalSectionEx
没有定义。
InitializeCriticalSectionEx
捕获了此问题。调用适当的替代函数。
#if defined(_WIN32_WINNT)
#if (_WIN32_WINNT < 0x0501)
#error Unsupported Windows version.
#endif
#elif defined(NTDDI_VERSION)
#if (NTDDI_VERSION < 0x05010100)
#error Unsupported Windows version.
#endif
#elif !defined(_WIN32_WINNT)
#define _WIN32_WINNT 0x0501
#define NTDDI_VERSION 0x05010100
#endif
#endif
#include <windows.h>
_WIN32_WINNT
已定义,如果未定义,则将其设置为 0x0501,即 Windows XP。
后 那个,windows.h 包括在内。在上一章我提到了
_WIN32_WINNT
控制实际包含哪个版本的 Windows 头文件。
_WIN32_WINNT
将设置为 Windows XP 并且 windows.h 将包含 Windows XP 的窗口标题(imo 已经是一个坏兆头)。
#include "Poco/UnWindows.h"
...
#if defined (_WIN32_WINNT_WINBLUE)
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#define _WIN32_WINNT _WIN32_WINNT_WINBLUE
...
_WIN32_WINNT
并导致包含 Windows XP header ,然后它重新定义
_WIN32_WINNT
是 Windows 8.1。我不知道为什么会这样,也许有一个很好的理由,idk。
_WIN32_WINNT
到 Windows XP _WIN32_WINNT
到 Windows 8.1 _WIN32_WINNT
检查 Windows 版本并识别 Windows 8.1(由 Poco 设置)InitializeCriticalSectionEx
已定义,因为 Windows 版本是 8.1(或者是吗?Poco 说:get rekt)和 InitializeCriticalSectionEx
从 Windows Vista 开始定义。 _WIN32_WINNT
事先自己:
#define _WIN32_WINNT 0x0A00 // either this
#include <Windows.h> // or this
#include <Poco/Poco.h>
#include <tbb/tbb.h>
void main()
{
}
关于c++ - 英特尔 TBB - 'InitializeCriticalSectionEx' : identifier not found compiler error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50039499/
我最近从 vs 2013 转移到 vs 2017。我们有这个项目有这些预处理器定义: WIN32 DRG_BUILD_DLL WINVER=0x0600 现在在 atlwinverapi.h 中,我收
我正在尝试在 VS2015 中构建一个 dll 项目以将其部署到 Windows XP 上。它适用于 Windows 7,但在 Windows XP SP3 上出错: The procedure en
我有一个依赖于 OpenCV 和 TBB 的 VS (C++) 项目,所以我为每个库创建了属性表并将它们包含在项目中。一切正常,代码已编译。 昨天,我已经开始使用 vcpkg包管理器。我通过 vcpk
我尝试编译我想在 OpenCV 上使用的 TBB。我正在使用 Windows XP 和 Visual Studio 2010 C++。当我编译 TBB 4.4 时出现错误 “无法在动态链接库 KERN
我是一名优秀的程序员,十分优秀!