【问题标题】:WIN32 Preprocessor definition in 64bit windows platform64位windows平台WIN32预处理器定义
【发布时间】:2021-09-15 02:31:59
【问题描述】:

在将 Visual 2012 C++ 项目迁移到目标 64 位平台时,我们是否应该将预处理器定义从 WIN32 更改为 WIN64。

现在我已经使用以下设置构建了项目

  • MACHINE(指定目标平台)设置为/MACHINE:X64

  • 目标环境设置为/env x64

  • 在 C/C++ 项目设置 -> 代码生成,结构成员 对齐到 8 个字节

请指导我应该更改哪些其他项目设置。

【问题讨论】:

标签: visual-studio-2010 visual-c++ 64-bit


【解决方案1】:

请务必注意,只有这些预处理器定义的下划线版本与 32 位和 64 位机器之间的区别有关。

下划线版本,_WIN32 和 _WIN64 是内置的,与运行 VC++ 的计算机的实际物理 CPU 相关。在 32 位机器上,总是会定义 _WIN32(用户不需要定义),但不会定义 _WIN64。在 64 位机器上,总是会定义 _WIN64,也可以定义 _WIN32,但代码可以依赖 _WIN64 来确定机器是否为 64 位。

对于 Visual Studio 2019(可能还有其他 VS 版本):

非下划线 WIN32 没有很好的文档记录,似乎与 32 与 64 机器类型无关。 Windows 的标准 Visual C++ 项目通常似乎不使用它(它可能根本没有使用)。感谢 BTJ 提出这一点。

Visual Studio 的另一个附注:如果您在 64 位计算机上运行 Visual Studio 并选择 Win32 与 x64 构建配置,您会注意到 WIN32 是为 Win32 构建配置定义的,但不是为 x64 定义的构建配置。这不会影响对象/二进制机器目标,例如32 对 64。其目的尚不清楚。如果希望使用它来#ifdef 源代码的某些部分,这些部分将针对 X86 和 X64 进行不同的编译,这可能是为了方便,但同样,它与编译器所针对的体系结构无关。对于编译器,目标体系结构由基于所选项目目标“平台”选择的工具集确定。链接器也有 /MACHINE arg 例如/机器:X86。

【讨论】:

  • 您是否有任何证据支持以下观点:例如,定义 WIN32(例如 cl.exe ... /D WIN32 ...)会导致 VC++ 为 32 位编译代码架构。我的理解是 WIN32 符号被 VC++ 忽略,因此在所有上下文中都是可选的。
  • 谢谢 BTJ,关于为什么 MS 在 32 位项目中使用 WIN32 的原因非常不清楚,但是您是正确的。我在 Visual Studio 和 64 位项目中进行了测试,无论编译步骤中是否定义了 WIN32,并且 dumpbin /HEADERS 显示 .exe 是 x64。我还构建了没有 WIN32 的 32 位项目,而 exe 是 32 位的。更新了原始帖子以反映这一方面。
【解决方案2】:

您的意思是 _WIN32 和 _WIN64 宏吗?如果您正确指定了所有参数(请参阅 P.S.),那么您不需要更改代码。在 64 位解决方案中必须同时定义 _WIN32 和 _WIN64。 _WIN32 宏指定您可以使用 Win32 API,_WIN64 宏指定编译为 64 位模式。您也可以为 Itanium (_M_IA64) 和 x86-64 (_M_AMD64) 使用不同的宏。详情见MSDN

附:您是否手动选择了平台参数?可以通过 VS 指定:

  1. 构建菜单 -> 配置管理器。
  2. 在 Active Solution Platform 中选择新建。
  3. 键入或选择新平台 -> x64 并单击“确定”。
  4. 现在在“平台”行中,您可以简单地选择 x64。

【讨论】:

    【解决方案3】:

    至少在 VS2015 中,链接器/所有选项/目标机

    这假设您在尝试构建 x64 时未使用配置为使用 x86 代码或构建为 32 位的第 3 方工具(例如小部件支持或硬件驱动程序),反之亦然

    【讨论】:

      猜你喜欢
      • 2016-07-04
      • 2011-02-28
      • 2010-11-10
      • 1970-01-01
      • 2013-09-11
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      • 2020-10-12
      相关资源
      最近更新 更多