(这个问题以 zlib 为例,但并不具体。)
我正在尝试使用它附带的 MSVC 项目文件在 Windows 上编译 zlib。我正在使用带有 Windows 8 SDK 的 VS2012,但我的构建机器是 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, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, 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 8 上运行,有没有办法让一个通用的二进制文件在 Windows 7 和 8 上运行并使用 CreateFile2 代码路径?(我想那是 GetProcAddress + 函数指针。还有什么?)