windows - 使用 Windows 8 SDK 为 Windows 7 编译

标签 windows winapi compilation zlib

(本题以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

关于windows - 使用 Windows 8 SDK 为 Windows 7 编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17102770/

相关文章:

python - 是否可以使用python编译c代码?

windows - 如何让 Rcpp 在 Windows XP 平台上的 R 中工作?

c - 如何在多个源文件中使用相同的结构?

windows - 如何知道 IEEE 1394 (FireWire) 是否连接到我的 Windows 7?

Windows 8 : Unable to allocate 2GB with 3GB User Address Space

java - 使用嵌入式 JRE 将 Shaded Java (jar) 构建为 Win32 可执行文件?

c# - C# 中的 Windows 凭据提供程序

Java静态方法变量在编译时解析,在运行时加载?

windows - 如何在用户登录 Windows 之前运行程序?

python - 在 Windows 上部署应用程序的最佳做法是什么?