【问题标题】:32bit 64bit compatible32位 64位兼容
【发布时间】:2023-03-30 23:25:01
【问题描述】:

我正在开发一个可以在 64 位计算机上运行的应用程序。

但是,我们使用的库包含无法更改的 32 位整数。我们需要在 64 位计算机上编译和运行。

应用程序运行时会产生什么影响?有什么解决办法吗?

非常感谢您的建议,

【问题讨论】:

  • 这是用于什么操作系统的?
  • 适用于 windows XP x86 和 vista x64 位。我只是想知道用整数进行计算。我会得到一个错误的答案吗?

标签: c 64-bit 32-bit


【解决方案1】:

当您谈论 64 位时,我假设您在这里指的是 x86 和 x86_64。

int 在这两种架构上都是 32 位的。

你往往会遇到的唯一问题是当你假设:

  • sizeof(void*) == sizeof(int)
  • sizeof(int) == sizeof(long)
  • longlong long 的大小相同。

否则你会没事的。

【讨论】:

  • "int 始终是 32 位" - 这不是真的。唯一的要求是 int 至少有 16 位和 sizeof(short) <= sizeof(int) && sizeof(int) <= sizeof(long)。事实上 int 在 16 位系统上通常是 16 位的(并不是说周围有很多)。
  • 有点迂腐我觉得考虑到任何提出这个问题的计算机都会有一个 32 位整数,他已经提到过。还是更正了我的答案。
【解决方案2】:

你有图书馆的来源吗?如果是这样,并且您重新编译它,您可能会侥幸逃脱(只要库的编写者在为 x86-64 编译时没有做出任何被破坏的假设)。努力测试,长期测试。

如果您没有有源代码(您只有一个 i386 编译的二进制文件),链接器甚至不会让您将 x86-64 代码链接到它。 ABI 只是不兼容。

在第二种情况下,您必须创建一个单独的 32 位帮助器/包装器进程,该进程链接到 32 位库,并通过 IPC 机制从 64 位进程接收调用库的请求(返回结果)。您可以在 IPC 周围的 64 位端创建包装函数,使其看起来像对库的正常调用。您的 64 位进程必须在启动时启动 32 位辅助进程(并确保辅助进程知道在父进程消失时退出)。

【讨论】:

    猜你喜欢
    • 2010-10-21
    • 2013-03-12
    • 1970-01-01
    • 2021-02-08
    • 2013-10-21
    • 1970-01-01
    • 2019-08-19
    • 2016-02-28
    • 1970-01-01
    相关资源
    最近更新 更多