无法定位程序输入点InitializeCriticalSectionEx 于动态链接库kernel32.dll
近期一个Opencv3.1项目需要在XP系统上跑,
用win10+VS2017开发的Dll,使用支持XP的141工具集,在XP上跑一直显示:
"无法定位程序输入点InitializeCriticalSectionEx 于动态链接库kernel32.dll"
然后在XP虚拟机上安装了VS2010,在XP环境下编译一样报错.
折腾了两天,在国外论坛上发现根源所在,VS2010在XP环境下的sdkddkver.h定义了操作系统编号:
#define _WIN32_WINNT 0x0601
Opencv在XP下编译其中源码:
#if _WIN32_WINNT >= 0x0600
if(InitializeCriticalSectionEx(&pMutex->mutex, 0, 0) == 0)
return OWN_STATUS_FAIL;
return OWN_STATUS_OK;
#else
__try
{
InitializeCriticalSection(&pMutex->mutex);
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
return OWN_STATUS_FAIL;
}
return OWN_STATUS_OK;
#endif
PS:尝试了网上说的在在Stdafx.h 头文件 #pragma once 下面添加
#define WINVER _WIN32_WINNT_WINXP
#define _WIN32_WINNT _WIN32_WINNT_WINXP 然而并没有什么卵用
其中默认_WIN32_WINNT 值为 0x0601 XP的kernel没有这个InitializeCriticalSectionEx函数,只有InitializeCriticalSection函数,解决方案:
- 替换所有InitializeCriticalSectionEx为InitializeCriticalSection
- 修改系统头文件sdkddkver.h 把
#define _WIN32_WINNT 0x0601 改为:
#define _WIN32_WINNT _WIN32_WINNT_WINXP
重新编译opencv,问题完美解决.