在不同的机器上编译(使用不同的gcc)

时间:2016-08-12 16:12:38

标签: linux gcc cross-compiling

是否可以在较新的gcc上创建目标代码(* .o),以及 然后将它们(以及libc等标准库)链接到另一台机器上。 如果机器是相同的,它应该可以工作,但我感兴趣的是两个版本不同的情况。这假设机器的基本架构(但不一定是所有的东西),比如两个系统都是linux,它们有不同的风格或不同的内核版本 (没有混合mac,linux和windows)。众所周知,各种Linux发行版的标准存储库都有不同的标准库

我的一个非常简单的例子,但我想知道这是否可能,以及通常的陷阱是什么?

它与Dev production libc/libstdc++ mismatch [link libc.so.6/libstdc++.so.6 with older version]有关,但认为这足以保证一个单独的问题

1 个答案:

答案 0 :(得分:1)

唯一的保证是ABI转发兼容性。这意味着旧的已编译二进制文件仍应针对较新版本的标准库运行(glib和libstdc ++都尽力使其工作)。

您建议将不同库和不同编译器构建的二进制文件的构建块组合在一起。由于种种原因,这可能会失败:

  • 一个内联函数,它假定其参数的某个bibary布局被传递给相同类型的较新版本。
  • 一个函数修改了一些内部库全局状态(线程本地存储,错误等),但是针对新库构建的目标文件的执行方式不同,或者全局更改/删除了。
  • 编译器/库ABI略有不同。原因很多,包括优化选项。

在最好的情况下,由于符号不匹配会导致链接器错误,但我不会指望它会阻止更糟。

请注意,至少在Linux上,静态库只是一组目标文件,因此上述所有内容也适用于它们。

不要在这个级别上混搭,只是不要。拯救自己和其他所有人的麻烦!