(この質問では例として 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 が見つからないため、zlib をロードしようとするアプリケーションはすべて失敗します。私のマシンは 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 を渡さない) の 2 つのバイナリ セットをビルドする必要があります。
Windows 7 と 8 の両方で動作し、Windows 8 で実行する場合に CreateFile2 コードパスを使用する共通のバイナリを持つ方法はありませんか? (その方法は GetProcAddress + 関数ポインターだと思います。他に何かありますか?)