无法定位程序输入点InitializeCriticalSectionEx 于动态链接库kernel32.dll

无法定位程序输入点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函数,解决方案:

  1. 替换所有InitializeCriticalSectionEx为InitializeCriticalSection
  2. 修改系统头文件sdkddkver.h 把
    #define _WIN32_WINNT 0x0601 改为:
    #define _WIN32_WINNT _WIN32_WINNT_WINXP

重新编译opencv,问题完美解决.

猜你喜欢

转载自blog.csdn.net/flykiss101/article/details/85097366