两台计算机必须有什么共同点才能运行相同的可执行文件

What must two computers have in common to run the same executable?

本文关键字:共同点 运行 可执行文件 什么 两台 计算机      更新时间:2023-10-16

我正在开发一个跨平台应用程序,我需要确定机器B是否能够运行在机器a上编译的应用程序。

我正在使用Qt,我已经知道我需要将Qt库与应用程序打包,或者针对Qt本身进行静态链接。

我也知道在Windows上编译的东西不能在Linux上运行。

然而,仍有一些其他矢量,我不确定它们在多大程度上重要。以下是我目前的理解总结:

影响可移植性

  • 操作系统(Windows、Mac、Linux)
  • 第三方库的可用性(Qt、静态与动态链接等)

可能影响便携性

  • Linux风格(Ubuntu、Red Hat、Fedora)
  • 体系结构(32或64位)
  • 操作系统版本(Windows 7与Windows XP、Rhel5与Rhel6)
  • 指令类型(i386、x64)

可能影响便携性项目中,哪些项目实际会影响便携性?我缺了什么吗?

全部。至少有可能。

如果两台不同的机器没有二进制兼容性(例如。它们运行在不同的体系结构上,或者与不兼容的系统),则将无法创建将在两者上运行的单个二进制文件。(或者…跑步Linux上Wine下的Windows程序计数?)

否则,就要看情况了。你提到第三方图书馆:如果它们是动态加载的,它们必须在那里,但始终是静态链接,并且可能有一些方法可以使用动态库,这样它就会在那里。

32位与64位是体系结构的区别:32位程序将不会在64位环境中运行,反之亦然。但大多数现代系统将同时提供这两种环境如果,则它们在64位机器上。

操作系统的风格和版本等问题更为复杂。当然,如果您使用最近添加到操作系统中的任何功能,您将无法在以前带有操作系统的计算机上运行已添加。否则:低级别系统的主要原因动态加载库是为了支持转发和向后兼容性;我听说它并不总是有效的,但我怀疑任何问题都涉及一些罕见的功能。(这是有限度的。现代Windows程序不会在Windows95下运行,反之亦然。)

还有一个问题是,各种可选软件包已安装。Qt需要Linux下的X Windows或Solaris;我在很多Linux和Solaris设备上工作过它没有安装(甚至没有显示器设备)。

还有一个问题是,它是否会以可接受的方式运行。它可能在比测试的机器更小、更旧的机器上运行它,但它最终可能会像疯了一样寻呼,以至于变得不可用。

如果在64位处理器上编译应用程序,则默认情况下不会在32位处理器上运行。但是,您可以将选项传递给编译器,使其编译代码以在32位处理器上运行。例如,如果您在64位机器上使用GCC,如果您传递-m32,它将编译32位代码。默认情况下,32位代码可以在64位计算机上运行。

来源

https://stackoverflow.com/a/3501880/193973

不同风格的Linux或操作系统版本可能有不同的系统库。例如,GetModuleFileNameEx功能仅在Windows XP及更高版本中可用。不过,只要你注意自己使用的功能,就不会有太大问题。

x64体系结构与x86("32位")向后兼容,因此为x86编译的程序将在x64计算机上运行,但反之亦然。请注意,还有其他不太常见的体系结构,如ARM和PowerPC。

我可以立即想到三件影响可移植性的事情。但是,如果您的代码是两个系统都能理解的文件格式,两个系统也能理解的指令集,并且只让两个系统理解系统调用,那么您的代码可能应该在两个系统上运行。

  • 可执行文件格式
    • Windows了解PE、COFF、COM、PEF、.NET等
    • Linux默认为ELF、OUT和其他
    • MaxOSX使用Mach-O
    • Linux也有运行Windows/Mac格式的扩展(Wine、Mono…)
  • 指令集
    • 每个处理器都有点不同,但是
    • 通常有一个"最低公分母"可以作为目标
      • 有时编译器会编写代码来执行两次函数
      • 一个带有液晶显示器,一个带有"更快"的指令集
      • 并且代码将在运行时选择正确的代码
    • x64可以运行64位和32位,但不能运行16位
    • x86可以运行32位和16位,但不能运行64位
  • 操作系统调用
    • 每个操作系统通常有不同的调用
    • 这可以通过使用动态库而不是直接的操作系统调用来避免
      • 比如…C运行库
      • 或者.Net的CLR