使用 Windows 8 SDK 为 Windows 7 进行编译

2023-11-30

(这个问题使用 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

请参阅此处了解更多信息:http://social.msdn.microsoft.com/Forums/en-US/winappswithnativecode/thread/3965645c-978c-4148-b32c-1853f7fd22b3

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Windows 8 SDK 为 Windows 7 进行编译 的相关文章

随机推荐