【问题标题】:Conditional compilation of same source as a 32 and 64 bit application [closed]与 32 位和 64 位应用程序相同源的条件编译 [关闭]
【发布时间】:2023-03-31 21:30:02
【问题描述】:

我们有一个 32 位 Windows 应用程序,它使用 C++ 和良好的旧 Windows 应用程序模型。从技术上讲,是否可以通过打开编译器开关或使用一些宏来将其编译为 32 位和 64 位?

目前我认为代码不会编译为 64 位应用程序,我将不得不修复编译错误,一般来说我应该如何进行才能编译为 64 位和 32 位应用程序。我应该记住什么?将面临哪些挑战?任何 cmets 和提示将不胜感激。 谢谢

【问题讨论】:

  • 你的问题太宽泛了。
  • 要回答您的第一个问题,是的,您可以使用一些编译器标志来打开 64 位或 32 位的编译。标志是什么以及如何传递它们取决于编译器。
  • 这实际上取决于您的应用程序在特定于硬件的代码以及它与其他二进制文件共享的任何表面区域方面所做的事情。

标签: c++ windows 32bit-64bit conditional-compilation


【解决方案1】:

关于“我应该记住什么?会有哪些挑战?”这些是我在将代码从 32 位移植到 64 位时遇到的最常见问题: p>

  • 假设指针为 4 字节
  • 假设 sizeof(int) == sizeof(pointer)
  • 假设 sizeof(int) == sizeof(size_t)
  • 内联/硬编码 x86 程序集

确保在编译时使用最严格的警告级别(/W4 在微软的编译器上或-Wall -Wextra -pedantic-errors 在 gcc 上)以帮助捕获从较大类型到较小类型的转换。

这是用于移植的 Microsoft 的 guide,但也适用于其他编译器。

【讨论】:

  • 感谢您的回复和移植指导。
【解决方案2】:

编译器根据其目标平台定义宏。例如,GCC 定义了__i386____amd64__,MSVC 分别为32 位和64 位定义了_M_IX86_M_X64。例如,您可以在预处理器 #ifdef 语句中使用这些宏来指导编译流程。

Pre-defined C/C++ Compiler Macros 上有一个针对不同编译器的优秀资源。

【讨论】:

  • 但是你为什么需要它们呢?
  • @JamesKanze 编译器宏还是专门为 32/64 位平台定义的宏?.. 例如,如果我想使用一些内联汇编器怎么办?
  • 32/64 位宏。 (对于内联汇编器:Microsoft 64 位编译器中没有。)
  • 好吧,我们不限于微软编译器,谢天谢地;)。但特别是对于 Microsoft,如果我想使用填充 CONTEXT 结构的函数来进行某些(例如堆栈跟踪)怎么办?有些东西架构是可靠的。
  • 大部分依赖于体系结构的东西应该在一个单独的模块中,并且您通过传递编译器的路径和文件名来选择正确的实现,而不是通过#ifdef 等。跨度>
【解决方案3】:

这当然是可能的,因为我们这样做了。最难的部分是 为 x64 配置 Visual Studios(这不是真的 这么难)。除此之外,没有什么特别的,在 至少如果 C++ 是最干净的(即使它是 不是)。完全相同的来源适用于两者。无条件 编译或任何需要。

【讨论】:

    【解决方案4】:

    移植时最大的问题应该是不同类型的 sizeof() 在这里和那里。因此,在 32 位上正确运行的代码片段可能会在 64 位上造成定时炸弹效应。例如,你可以有一些这样的代码:

    size_t sz = GetSomethingBig();
    DWORD dw = (DWORD)sz;
    

    因此,在 32 位时,size_t 和 DWORD 这两种类型具有相同的大小(4 个字节)。在移植版本中,size_t 将是 8 个字节长,而 DWORD 仍然相同。当我们进行原始 C 风格的类型转换时,不会出现编译错误。在运行时,如果 sz 小于 0x100000000,一切正常。所有其他值都将导致数据丢失,影响难以预测。

    【讨论】:

      猜你喜欢
      • 2014-04-18
      • 2012-09-01
      • 1970-01-01
      • 2012-01-05
      • 2020-11-25
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      • 1970-01-01
      相关资源
      最近更新 更多