如何设置 XAudio2 dll 版本
How to set XAudio2 dll version
我的 MSVC 2015 C++ 应用程序项目使用 xaudio2.lib
。所以 .cvxproj 包含一行
<AdditionalDependencies>xaudio2.lib;%(AdditionalDependencies)</AdditionalDependencies>
查看构建的 .exe,我可以找到一行 XAudio2_8.dll
。
所以编译器(或链接器)似乎决定只使用 2_8 版本。
导致我的app无法在Windows7机器上运行,因为那里只安装了XAudio2.dll
的低版本,找不到[=12] =].
那么我如何 fix/modify 我的项目才能使生成的 .exe 在 Windows 7 上 运行?例如,我如何指定使用 XAudio2_7.dll
?
UPDATE: XAudio 2.9 functionality is now available for Windows 7 SP1, Windows 8, and Windows 10 via the XAudio2Redist. Therefore, you DO NOT NEED the legacy DirectX SDK anymore to target Windows 7 with XAudio2 or if you want xWMA support on Windows 8.x. The code below has been updated for the scenario of when you include the NuGet package.
如果您使用的是 Windows 8.0 SDK 或 Windows 8.1 SDK,则 xaudio2.h
header 和 xaudio2.lib
都是 link 到需要 Windows 8 或更高版本的 XAudio 2.8。如果您为 Windows 7 兼容的 exe(即 /D _WIN32_WINNT=0x0601
或 /D _WIN32_WINNT=0x0600
)正确设置了 _WIN32_WINNT
,那么当您构建应用程序时,您会看到 build-time失败恰恰是因为 Windows Vista 或 Windows 7
不支持 XAudio 2.8
如果您使用 Windows 10 SDK,那么 xaudio2.h
header 如果 _WIN32_WINNT
设置为 0x0A00
,则 xaudio2.h
header 使用 XAudio 2.9,当 link仅在 Windows 10 上反对 xaudio2.lib
。如果使用 Windows 10 SDK,您可以将 WIN32_WINNT
设置为 0x0602
或 0x0603
,link 对 xaudio2_8.lib
,它将再次使用 XAudio 2.8 .
要支持 Windows 7 SP1 或更高版本,您应该使用 XAudio2Redist,它在 Windows 7 SP1 上提供 XAudio 2.9 功能,Windows 8,和 Windows 8.1。在 Windows 10 上它会自动转发到 XAudio 2.9 的 OS 版本——如果你只支持 Windows 10 你不需要 XAudio2Redist 因为 XAudio 2.9 是 Windows 10 OS 的一部分。 NuGet 包包括 xaudio2_9redist.lib
和 xapobaseredist.lib
.
要支持 Windows 7 RTM 或更早版本,您必须使用 legacy DirectX SDK to get the XAudio 2.7 headers, and you must deploy XAUDIO2_7.DLL
using the legacy DirectSetup 包。由于 header 与 Windows 8.x SDK 和 Windows 10 SDK 冲突,实际上最好对旧版 Direct SDK [=] 做一个 full-path 参考72=]s 除了需要正确设置项目包括路径。
例如,DirectX Tool Kit for Audio DX11 / DX12 在 Audio.h
header 中有以下内容:
#if defined(USING_XAUDIO2_REDIST) || (_WIN32_WINNT >= 0x0A00 /*_WIN32_WINNT_WIN10*/)
#define USING_XAUDIO2_9
#elif (_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/)
#define USING_XAUDIO2_8
#else
#define USING_XAUDIO2_7_DIRECTX
#endif
#if defined(USING_XAUDIO2_8) || defined(USING_XAUDIO2_9)
#include <xaudio2.h>
#include <xaudio2fx.h>
#include <x3daudio.h>
#include <xapofx.h>
#ifndef USING_XAUDIO2_REDIST
#if defined(USING_XAUDIO2_8) && defined(NTDDI_WIN10)
#pragma comment(lib,"xaudio2_8.lib")
#else
#pragma comment(lib,"xaudio2.lib")
#endif
#endif
#else // USING_XAUDIO2_7_DIRECTX
// Using XAudio 2.7 requires the DirectX SDK
#include <C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include\comdecl.h>
#include <C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include\xaudio2.h>
#include <C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include\xaudio2fx.h>
#include <C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include\xapofx.h>
#pragma warning(push)
#pragma warning( disable : 4005 )
#include <C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include\x3daudio.h>
#pragma warning(pop)
#pragma comment(lib,"x3daudio.lib")
#pragma comment(lib,"xapofx.lib")
#endif
参见 Adding the DirectX Tool Kit for Audio, XAudio2 and Windows 8, Known Issues: XAudio 2.7, and Using the Windows Headers。
我的 MSVC 2015 C++ 应用程序项目使用 xaudio2.lib
。所以 .cvxproj 包含一行
<AdditionalDependencies>xaudio2.lib;%(AdditionalDependencies)</AdditionalDependencies>
查看构建的 .exe,我可以找到一行 XAudio2_8.dll
。
所以编译器(或链接器)似乎决定只使用 2_8 版本。
导致我的app无法在Windows7机器上运行,因为那里只安装了XAudio2.dll
的低版本,找不到[=12] =].
那么我如何 fix/modify 我的项目才能使生成的 .exe 在 Windows 7 上 运行?例如,我如何指定使用 XAudio2_7.dll
?
UPDATE: XAudio 2.9 functionality is now available for Windows 7 SP1, Windows 8, and Windows 10 via the XAudio2Redist. Therefore, you DO NOT NEED the legacy DirectX SDK anymore to target Windows 7 with XAudio2 or if you want xWMA support on Windows 8.x. The code below has been updated for the scenario of when you include the NuGet package.
如果您使用的是 Windows 8.0 SDK 或 Windows 8.1 SDK,则 xaudio2.h
header 和 xaudio2.lib
都是 link 到需要 Windows 8 或更高版本的 XAudio 2.8。如果您为 Windows 7 兼容的 exe(即 /D _WIN32_WINNT=0x0601
或 /D _WIN32_WINNT=0x0600
)正确设置了 _WIN32_WINNT
,那么当您构建应用程序时,您会看到 build-time失败恰恰是因为 Windows Vista 或 Windows 7
如果您使用 Windows 10 SDK,那么 xaudio2.h
header 如果 _WIN32_WINNT
设置为 0x0A00
,则 xaudio2.h
header 使用 XAudio 2.9,当 link仅在 Windows 10 上反对 xaudio2.lib
。如果使用 Windows 10 SDK,您可以将 WIN32_WINNT
设置为 0x0602
或 0x0603
,link 对 xaudio2_8.lib
,它将再次使用 XAudio 2.8 .
要支持 Windows 7 SP1 或更高版本,您应该使用 XAudio2Redist,它在 Windows 7 SP1 上提供 XAudio 2.9 功能,Windows 8,和 Windows 8.1。在 Windows 10 上它会自动转发到 XAudio 2.9 的 OS 版本——如果你只支持 Windows 10 你不需要 XAudio2Redist 因为 XAudio 2.9 是 Windows 10 OS 的一部分。 NuGet 包包括 xaudio2_9redist.lib
和 xapobaseredist.lib
.
要支持 Windows 7 RTM 或更早版本,您必须使用 legacy DirectX SDK to get the XAudio 2.7 headers, and you must deploy XAUDIO2_7.DLL
using the legacy DirectSetup 包。由于 header 与 Windows 8.x SDK 和 Windows 10 SDK 冲突,实际上最好对旧版 Direct SDK [=] 做一个 full-path 参考72=]s 除了需要正确设置项目包括路径。
例如,DirectX Tool Kit for Audio DX11 / DX12 在 Audio.h
header 中有以下内容:
#if defined(USING_XAUDIO2_REDIST) || (_WIN32_WINNT >= 0x0A00 /*_WIN32_WINNT_WIN10*/)
#define USING_XAUDIO2_9
#elif (_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/)
#define USING_XAUDIO2_8
#else
#define USING_XAUDIO2_7_DIRECTX
#endif
#if defined(USING_XAUDIO2_8) || defined(USING_XAUDIO2_9)
#include <xaudio2.h>
#include <xaudio2fx.h>
#include <x3daudio.h>
#include <xapofx.h>
#ifndef USING_XAUDIO2_REDIST
#if defined(USING_XAUDIO2_8) && defined(NTDDI_WIN10)
#pragma comment(lib,"xaudio2_8.lib")
#else
#pragma comment(lib,"xaudio2.lib")
#endif
#endif
#else // USING_XAUDIO2_7_DIRECTX
// Using XAudio 2.7 requires the DirectX SDK
#include <C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include\comdecl.h>
#include <C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include\xaudio2.h>
#include <C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include\xaudio2fx.h>
#include <C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include\xapofx.h>
#pragma warning(push)
#pragma warning( disable : 4005 )
#include <C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include\x3daudio.h>
#pragma warning(pop)
#pragma comment(lib,"x3daudio.lib")
#pragma comment(lib,"xapofx.lib")
#endif
参见 Adding the DirectX Tool Kit for Audio, XAudio2 and Windows 8, Known Issues: XAudio 2.7, and Using the Windows Headers。