对于C ++,Clang是否比(或更多)可移植?

时间:2015-06-15 12:17:57

标签: clang

假设我有一个C ++项目,我用gcc和clang编译它。您可以假设gcc编译版本在另一台Linux机器上运行。这是否意味着(在正常情况下)clang版本也将在另一台Linux机器上运行?

4 个答案:

答案 0 :(得分:2)

如果程序是一个简单的Hello世界,它应该在通过Clang编译时在另一台机器上工作。

但是当程序是一个真正的程序,有很多行和编译单元,并且调用许多外部库时,一切都是可能的,这取决于程序本身和编译选项:

  • 硬件要求(内存)不同(主要取决于编译选项)
  • 在gcc和clang之间使用不同的(版本)库
  • UB将预期结果分为一个而不是另一个
  • 实施定义规则的不同用法
  • 使用clang
  • 不接受的gcc扩展名

对于上述所有情况,除了2之外,它应该在其运行的其他机器上运行

答案 1 :(得分:1)

linux程序依赖于他们的构建环境。如果您的glibc版本或内核不同,那么可执行文件将无法运行。你可以使用llvm的解释器语言,它编译成可以在各种操作系统上解释的字节码。

答案 2 :(得分:1)

答案是,取决于。

第一个硬性要求是相同的CPU架构。 64位不足以成为限定符。如果编译x64,那么在64位ARM上运行它将不会有太大成功。

下一个重要的是图书馆。如果您在程序中使用任何库,则目标系统需要具有这些库。这包括内核头文件。所以如果你为当前的内核版本,使用最先进的功能,那么你将无法在一个非常老的Linux版本上运行该程序。

最后一个是硬件依赖。如果您创建一个程序,例如需要4 GB的RAM,然后尝试在具有256 MB RAM的小型嵌入式设备上运行它,这也无法正常工作。

更好地适应你改变的问题:根据我的经验,Clang和gcc之间的可移植性应该没有多大区别。谷歌搜索没有发现任何东西,所以它应该基本上工作。但是,在生产中发布一些二进制文件之前,最好总是测试类似的东西。

答案 3 :(得分:1)

Clang bin与gcc二进制文件一样可移植,只要你链接到相同的库并且你没有将-march=native之类的标志传递给编译器。

Clang比gcc有一个巨大的优势,它可以处理几乎所有的libstdc ++版本, 虽然gcc绑定到其捆绑版本,但通常无法解析任何旧版本。

因此,以下情况经常发生在生产环境中:

  • 安装LTS发行版(例如Ubuntu 12.04)
  • 保持gcc,glibc和libstdc ++不受影响
  • 为C ++ 11等安装最新的clang版本
  • 使用clang
  • 构建发布二进制文件

所以(在我的具体例子中)这些二进制文件将适用于所有 发布libstdc++ >= 4.6glibc >= 2.15

This对您来说可能是一本有趣的读物。