我正在使用 Visual C++ 2013 编译器(特别是在 Windows 平台上具有 C++11 功能)构建跨平台库,并使用 CMake(NMake 生成器)作为构建系统。我使用的是 Windows 7。
我的库使用一些仅在 Windows 8/7 中可用的函数/枚举值/结构成员。
我希望能够为 Windows XP、Windows Vista、Windows 7 和 Windows 8/8.1 操作系统版本以及 x86、x64 和 ARM 架构构建库,即不是一个仅针对 Windows XP 并在任何地方都可以工作的构建,而是许多不同的构建针对特定操作系统的构建,因为较新的操作系统版本具有我的库可以提供的更多有用功能。
我的问题是:
如何告诉编译器针对特定操作系统版本(即 XP、Vista、7、8、8.1 等)?
如何告诉编译器针对特定架构(即 x86、x64、arm 等)?
如果我使用仅在 Windows 8/7 中可用的函数/枚举值/结构成员,但构建针对 Windows XP 的库,会发生什么情况?编译器会警告我 Windows XP 上不存在这样的东西吗?或者它实际上可以编译但无法在Windows XP系统上运行?
如何才能使我的代码在针对 Windows XP 进行编译时跳过 Windows XP 中不存在的内容(Windows 7/8 函数等)?
当针对不同的操作系统版本时,我使用哪个 Windows SDK 版本重要吗?我似乎已经安装了 8.1、8.0 和 7.1 Windows SDK。即使针对 Windows XP,如果我始终使用最新的 SDK 版本,可以吗?
以下是我找到的一些答案,我不确定这些答案是否正确或完整:
我只需要设置_WIN32_WINNT
and WINVER
定义为适合目标系统的值 https://msdn.microsoft.com/en-us/library/windows/desktop/aa383745(v=vs.85).aspx#macros_for_conditional_declarations就是这样,除此之外我不需要设置任何内容,我的应用程序将在指定的系统(即 Windows XP)上运行。
- 使用“C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat”设置编译器环境变量时需要使用适当的选项,即“C:\Program Files (x86)\Microsoft Visual Studio 12.0 \VC\vcvarsall.bat amd64" 对于 64 位。
-
我还需要指定合适的/SUBSYSTEM value https://msdn.microsoft.com/en-us/library/fcc1zstk.aspx到链接器,即/SUBSYSTEM:WINDOWS,5.02
or /SUBSYSTEM:WINDOWS,6.00
对于 x64。但有什么区别5.02
and 6.00
?为什么两个值指定相同的内容(64 位)?同样适用于5.01
and 6.00
,为什么他们都指定32位?我认为 64/32 位有一个值就足够了。
- 这些值(
5.01
, 5.02
and 6.00
)看起来与平台值相似WINVER
来自(1)。除了架构之外,他们还设置目标操作系统吗?但WINVER=502
from (1) 用于针对 Windows Server 2003,根据维基百科,Windows Server 2003 发布了 64 位和 32 位版本,但在这里 5.02 严格代表 64 位,这没有意义......
编译器将无法编译,因为WINVER
从 (1) 定义将排除目标操作系统中不存在的函数和内容(Windows 头文件使用该定义来#ifdef
事物)。
我应该#ifdef
事物基于WINVER
在我自己的代码中,就像 Windows 标头一样,并在需要时提供缺失功能的替代方案。
不知道。
请注意,我没有使用 Visual Studio IDE,因此告诉我在 IDE 中设置选项 X 有点没有意义。
我来自 Linux 开发,所以 Windows 的东西对我来说有点新鲜。
您对自己问题的回答大部分是正确的。一些澄清和更正:
子系统版本与目标架构正交。什么是/subsystem
文档说的是minimumx86 的子系统版本是 5.01,minimumx64 的子系统版本是 5.02。对于控制台和 Windows 应用程序,子系统版本与内部操作系统版本号相同。 5.01 是 x86 Windows XP; 5.02 是 x64 Windows XP。 Windows XP 有两个不同的版本号,因为 x64 Windows XP 的发布晚于 x86 Windows XP。较新的操作系统对于所有体系结构都具有相同的版本号(例如,对于 x86 和 x64,Windows Vista 都是版本 6.0)。
请注意,通过设置子系统版本,您可以限制程序运行的操作系统集。例如,如果您将子系统版本设置为6.2,您的程序将只能在Windows 8及更高版本上运行。如果您尝试在例如上运行该程序Windows 7,它将无法运行。 (对于 DLL 也是如此:如果您有一个 DLL 的目标操作系统比您正在运行的操作系统更新,则加载程序将不会加载该 DLL,至少不会加载代码执行。)
请参阅维基百科的页面“Microsoft Windows 版本列表” https://en.wikipedia.org/wiki/List_of_Microsoft_Windows_versions获取操作系统版本列表。 Windows XP 是 Visual Studio 2013 支持的最旧的 Windows 版本。
Windows 8 SDK 仅支持Windows Vista 以下版本的软件开发。如果你想设置_WIN32_WINNT
or WINVER
要针对 Windows XP 进行构建,您需要使用 Windows 7 SDK(Visual Studio 2013 将安装这两个 SDK)。
除非您的程序对于每个目标操作系统都有很大不同,否则构建一个在您想要支持的最旧的操作系统(Windows XP)上运行并延迟加载或动态加载(通过LoadLibrary
/GetProcAddress
) 您想要从较新的操作系统使用的任何功能(当该功能可用时)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)