8

发行版之间是否存在任何会影响在一个发行版上直接在另一个发行版上使用 GCC 4.7.x 编译的 C++ 二进制文件的特性或变化?我知道理想的情况是在第二个发行版上从源代码编译,但我真的不想担心在我的生产机器上编译新的 GCC 版本和程序源代码。我是一个相对缺乏经验的 linux 用户(因此提出了问题!)并且仍然更喜欢 IDE,而不是命令行编译,ssh 是我真正可以用来访问生产机器的全部。

代码本身没有什么有趣的,但它确实利用了一些运行的操作系统工具,比如阻塞套接字等。

任何建议将不胜感激!

4

4 回答 4

5

除非二进制文件构建在完全相同的操作系统(包括版本)和完全相同的硬件上,否则无法保证。

在实践中:

  1. 如果硬件是同一系列的芯片,它应该可以工作。

    • 这是因为大多数人没有打开硬件特定的优化(但他们可以)。
    • 跨芯片组移动二进制文件不太可能奏效
    • 将二进制文件从硬件系列的较旧成员转移到较新成员可能会奏效
    • 将二进制文件从硬件系列的较新成员移动到较旧成员的可能性较小(但将取决于优化和编译器设置(从 64 位架构迁移到 32 位架构不太可能起作用)。
  2. 如果操作系统具有相同的主要编号,那么它应该(可能)工作。

    • 二进制文件可以运行的操作系统版本取决于用于构建它的编译器版本和主机操作系统。
    • 如果编译器在它生成的 ABI 中发生了变化,那么所有的赌注都会被取消。但通常编译器生成的 ABI 的变化将是一个主要问题,因此只会发生在 OS 路线图的主要点(而不是微小的增量)。
  3. 我的建议是从源头构建的。

    • 不要专门去更新开发环境(使用发行版附带的环境(如果您进行默认更新,它们不会破坏向后兼容性))。
    • README只需阅读文件即可轻松构建。但通常它涉及运行两个命令./configuremake. 如果你不想要任何特别的东西,你通常不需要做任何其他事情。
于 2012-10-19T15:35:12.053 回答
3

使用静态链接,必须满足两个条件:

1)目标系统和构建系统必须具有相同的架构(例外:您可以在许多 64 位主机上运行 32 位二进制文​​件)

2) 目标系统上的 (g)libc 包不能是比构建系统上的旧版本(有时您可以避免微小的版本差异)

动态链接变得更加复杂。

于 2012-10-19T15:31:47.637 回答
3

G++ 已经拥有稳定的 ABI 很长一段时间了,所以这不会引起问题。可能导致问题的是使用动态链接库。运行该程序的系统将需要具有编译可执行文件所针对的任何共享库的兼容版本。如果你只使用静态链接,你应该没有问题。-static您可以使用该选项打开静态链接。

于 2012-10-19T15:29:57.730 回答
0

通常,基于较新发行版构建的二进制文件不适用于旧版本,但基于旧发行版构建的二进制文件将适用于较新发行版。目前,如果您在 RedHat EL4 上构建二进制文件,它将适用于大多数受支持的发行版。(如果缺少,您可能需要复制 libstdc++)

于 2012-10-19T15:27:00.057 回答