使用Windows 8 SDK编译Windows 7

(这个问题使用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版本上使用Windows SDK,因此我的问题是:

我唯一的办法是修补zlib在第一行添加_WIN32_WINNT> = _WIN32_WINNT_WIN8的检查,并将/ D_WIN32_WINNT = _WIN32_WINNT_WIN7传递给msbuild? 这意味着我将不得不build立两套二进制文件 – 一个支持Win7(通过传递/ D)和一个支持Win8(通过不传递/ D)。

是否没有办法有一个共同的二进制文件在Windows 7和8上都可以使用,并且在Windows 8上运行时使用CreateFile2代码path? (我想这是GetProcAddress +函数指针,还有什么?)

Solutions Collecting From Web of "使用Windows 8 SDK编译Windows 7"

您可以使用_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

这个问题是旧的,但如果任何人仍然有这个问题,我只是通过修改(iowin32.c文件行28)中的代码成功构建最新的ZLIB与msvc 12.0针对Windows 7,如下所示:

 #if _WIN32_WINNT >= _WIN32_WINNT_WIN8 #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 #endif 

当然要做这个工作,你需要在配置属性> C / C ++> preprocessor中定义一个宏:

 _WIN32_WINNT=0x0601 

这意味着你的目标是Windows 7(如果使用Windows 7 SDK这是不需要的)

然后重建项目与成功:)是的,当然这个修复只适用于如果您使用Windows 8以上的Windows。

然而,这不是zlib唯一的错误,你一定会在zlib.def文件中遇到一个不匹配的版本。 要解决这个问题,打开包含错误的zlib.def文件,用1.28或者版本号替换1.2.8

你可以做到这一点,你至少已经安装了VS2012的Update 1,因为这样可以让你编译XP,这个链接是针对Windows 7 SDK的减少版本的。

我们使用我们的一些代码来做到这一点,它在XP,Windows 7和Windows 8上是兼容的。

有关详细信息,请参阅MSDN博客 。

下面的关键信息

MSDN

据我所知,唯一的办法是使用LoadLibrary()GetProcAddress() – 你也可以在MFC Sources中看到这个处理WIn7(或更高版本)

例如: CWnd::OnGesture()%VCINSTALLDIR%atlmfc\src\mfc\wincore.cpp