两台计算机必须共同运行相同的可执行文件?

时间:2013-07-12 16:50:03

标签: c++ compilation operating-system cross-platform cross-compiling

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

我正在使用Qt,我已经明白我需要将Qt库与应用程序打包或静态链接到Qt本身。

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

然而,还有一些其他的载体,我不确定它们的重要程度。以下是我目前理解的摘要:

影响可移植性

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

可能影响可移植性

  • Linux的风味(Ubuntu,Red Hat,Fedora)
  • 架构(32或64位)
  • 操作系统版本(Windows 7 vs Windows XP,Rhel5 vs Rhel6)
  • 指令类型(i386,x64)

可能影响可移植性项目,实际上有哪些?有没有我错过的?

4 个答案:

答案 0 :(得分:2)

全部。至少可能。

如果两台不同的机器没有二进制兼容性(例如 它们运行在不同的体系结构或接口上 不兼容的系统),那么就不可能创造出来 一个将在两者上运行的二进制文件。 (或者...正在运行 Wine on Linux下的Windows程序计数?)

否则,取决于。你提到第三方库:如果 他们是动态加载的,他们必须在那里,但有 总是静态链接,可能有部署方式 动态库,以便它就在那里。

32位与64位是体系结构的差异:32位 程序不会在64位环境中运行,反之亦然。 但是大多数现代系统都会使两种环境都可用 如果他们在64位计算机上。

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

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

还有一个问题是它是否可以接受。有可能 在比您测试的机器更小的旧机器上运行 它,但它可能最终像疯了一样分页到它的地步 变得无法使用。

答案 1 :(得分:0)

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

<强>来源

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

答案 2 :(得分:0)

不同版本的Linux或操作系统版本可能具有不同的系统库。例如,GetModuleFileNameEx功能仅适用于Windows XP及更高版本。只要你看一下你使用的功能,它就不应该是一个太大的问题了。

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

答案 3 :(得分: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位。
  • 操作系统调用
    • 每个操作系统通常都有不同的呼叫
    • 使用动态库而不是直接OS调用可以避免这种情况
      • 例如...... C运行时库。
      • 或.Net的CLR。