我正在尝试使用它附带的MSVC项目文件在Windows上编译zlib.我正在使用VS2012和Windows 8 SDK,但我的构建机器是Windows 7.
Zlib包含以下代码:
#ifdef IOWIN32_USING_WINRT_API if ((filename!=NULL) && (dwDesiredAccess != 0)) hFile = CreateFile2((LPCTSTR)filename,dwDesiredAccess,dwShareMode,dwCreationDisposition,NULL); #else if ((filename!=NULL) && (dwDesiredAccess != 0)) hFile = CreateFile((LPCTSTR)filename,NULL,dwFlagsAndAttributes,NULL); #endif
其中IOWIN32_USING_WINRT_API设置如下
#if defined(WINAPI_FAMILY_PARTITION) && (!(defined(IOWIN32_USING_WINRT_API))) #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) #define IOWIN32_USING_WINRT_API 1 #endif #endif
WINAPI_FAMILY_PARTITION和WINAPI_PARTITION_APP在Windows 8 SDK(winapifamily.h)中定义,因此结果是可以编译在zlib中使用CreateFile2的代码.
我可以编译zlib,但是任何尝试加载它的应用程序都会失败,因为它找不到CreateFile2,这是正确的,因为我的机器是Windows 7并且该API是在Windows 8中引入的.
这是我第一次在较低版本的Windows上使用Windows SDK而不是它支持,因此我的问题是:
我唯一可以使用补丁zlib来检查_WIN32_WINNT> = _WIN32_WINNT_WIN8到第一行,并将/ D_WIN32_WINNT = _WIN32_WINNT_WIN7传递给msbuild?这意味着我必须构建两组二进制文件 – 一组支持Win7(通过传递/ D)和一组支持Win8(不传递/ D).
是否没有办法在Windows 7和8上运行兼容的公共二进制文件,如果在Windows 8上运行,则使用CreateFile2代码路径? (我想这种方式是GetProcAddress函数指针.还有别的吗?)
#if defined(WINAPI_FAMILY_PARTITION) && (!(defined(IOWIN32_USING_WINRT_API))) #if WINAPI_FAMILY_ONE_PARTITION(WINAPI_FAMILY_DESKTOP_APP,WINAPI_PARTITION_APP) #define IOWIN32_USING_WINRT_API 1 #endif #endif
有关详细信息,请参阅此处:http://social.msdn.microsoft.com/Forums/en-US/winappswithnativecode/thread/3965645c-978c-4148-b32c-1853f7fd22b3