2

我正在开发一个跨平台应用程序,我需要确定机器 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)

可能影响便携性的项目中,哪些项目实际上会影响?有什么我想念的吗?

4

4 回答 4

2

全部。至少有可能。

如果两台不同的机器没有二进制兼容性(例如,它们运行在不同的架构上,或者与不兼容的系统接口),那么就不可能创建一个可以在两者上运行的单一二进制文件。(或者......在 Linux 上的 Wine 下运行 Windows 程序算不算?)

否则,这取决于。您提到第三方库:如果它们是动态加载的,则它们必须存在,但始终存在静态链接,并且可能有与动态库一起部署的方法,因此它将存在。

32 位与 64 位在架构上有所不同:32 位程序不会在 64 位环境中运行,反之亦然。但是,如果大多数现代系统都在 64 位机器上,它们将使这两种环境都可用 。

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

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

还有一个问题是它是否会以可接受的方式运行。它可能在比您测试它的机器更小、更旧的机器上运行,但它最终可能会疯狂地分页,直至无法使用。

于 2013-07-12T17:04:55.647 回答
0

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

来源

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

于 2013-07-12T16:54:45.017 回答
0

不同风格的 Linux 或操作系统版本可能具有不同的系统库。例如,该GetModuleFileNameEx功能仅在 Windows XP 及更高版本中可用。只要您注意您使用的功能,它应该不是太大的问题。

x64 架构向后兼容 x86(“32 位”),因此为 x86 编译的程序将在 x64 机器上运行,反之则不行。请注意,还有其他不太常见的架构,例如 ARM 和 PowerPC。

于 2013-07-12T16:58:08.777 回答
0

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

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