Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 两台计算机必须有什么共同点才能运行同一个可执行文件?_C++_Compilation_Operating System_Cross Platform_Cross Compiling - Fatal编程技术网

C++ 两台计算机必须有什么共同点才能运行同一个可执行文件?

C++ 两台计算机必须有什么共同点才能运行同一个可执行文件?,c++,compilation,operating-system,cross-platform,cross-compiling,C++,Compilation,Operating System,Cross Platform,Cross Compiling,我正在开发一个跨平台的应用程序,我需要确定机器B是否能够运行在机器a上编译的应用程序 我正在使用Qt,我已经了解到我需要将Qt库与应用程序打包,或者针对Qt本身进行静态链接 我也明白在Windows上编译的东西不能在Linux上运行 然而,还有一些其他的向量,我不确定它们的重要性。以下是我目前理解的总结: 影响可移植性 操作系统(Windows、Mac、Linux) 第三方库的可用性(Qt、静态链接与动态链接等) 可能会影响便携性 Linux的味道(Ubuntu、Red Hat、Fedor

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

可能会影响可移植性的项目,哪些项目会影响可移植性?有我遗漏的吗?

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

来源


不同版本的Linux或操作系统可能有不同的系统库。例如,
GetModuleFileNameEx
函数仅在Windows XP及以上版本中可用。不过,只要你注意你使用的函数,就不会有太大的问题


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

All。至少有可能

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

否则就要看情况了。您提到第三方库:如果 它们是动态加载的,它们必须在那里,但是 始终使用静态链接,并且可能有使用 动态库,以便它将在那里

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

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

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

还有一个问题是它的运行是否可以接受。可能 在比您测试的机器更小、更旧的机器上运行 但是它可能会疯狂地寻呼到它
无法使用。

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

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

这里的酒和水有两个极端。公共性的最小量是两个系统上只存在一个可执行文件;另一种情况是,在一台计算机上运行的每个程序也将在另一台计算机上运行。可移植性不是二进制属性。