(本题以zlib为例,但不具体)
我正在尝试使用它附带的 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, 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 7 和 8 上运行,并且如果在 Windows 8 上运行则使用 CreateFile2 代码路径? (我想那是 GetProcAddress + 函数指针。还有什么吗?)
最佳答案
您可以使用 _WIN32_WINNT
选择您要定位的操作系统版本。损坏的是 zlib 检查。 WINAPI_FAMILY_DESKTOP_APP
包括 WINAPI_FAMILY_APP
所以他们的检查总是成功的。您可以像这样修复它:
#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
关于windows - 使用 Windows 8 SDK 为 Windows 7 编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17102770/