对于C+,Clang是否比gcc更具可移植性+;? 假设我有一个C++项目,我用GCC和CLAN编译它。您可以假设gcc编译版本在另一台linux机器上运行。这是否意味着(在正常情况下)clang版本也将在其他linux机器上运行?

对于C+,Clang是否比gcc更具可移植性+;? 假设我有一个C++项目,我用GCC和CLAN编译它。您可以假设gcc编译版本在另一台linux机器上运行。这是否意味着(在正常情况下)clang版本也将在其他linux机器上运行?,clang,Clang,linux程序取决于其构建环境。如果您的glibc版本或内核不同,那么有很多可能无法运行可执行文件。您可以使用llvm的解释器语言,它编译成字节码,可以在各种操作系统上进行解释。linux程序取决于它们的构建环境。如果您的glibc版本或内核不同,那么有很多可能无法运行可执行文件。不过,您可以使用llvm的解释器语言,它编译成字节码,可以在各种操作系统上进行解释。答案是,嗯,这取决于具体情况 第一个硬需求是相同的CPU架构。64位是不够的限定符。如果编译x64,那么在64位ARM上运行它不会有多

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

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

答案是,嗯,这取决于具体情况

第一个硬需求是相同的CPU架构。64位是不够的限定符。如果编译x64,那么在64位ARM上运行它不会有多大成功

下一个大问题是图书馆。如果在程序中使用任何库,目标系统需要这些库。这包括内核头。因此,如果您使用最先进的功能为当前的内核版本进行编译,那么在非常旧的Linux版本上运行该程序将毫无乐趣

最后一个是硬件依赖性。如果您创建了一个需要4GB内存的程序,然后尝试在一个具有256MB内存的小型嵌入式设备上运行它,那么这也不会起作用


为了更好地适应您已经改变的问题:根据我的经验,Clang和gcc在可移植性方面应该没有太大区别。谷歌搜索也没有发现任何东西,所以它基本上应该是有效的。但最好在生产中发布二进制文件之前测试这些东西。

答案是,好吧,这取决于具体情况

第一个硬需求是相同的CPU架构。64位是不够的限定符。如果编译x64,那么在64位ARM上运行它不会有多大成功

下一个大问题是图书馆。如果在程序中使用任何库,目标系统需要这些库。这包括内核头。因此,如果您使用最先进的功能为当前的内核版本进行编译,那么在非常旧的Linux版本上运行该程序将毫无乐趣

最后一个是硬件依赖性。如果您创建了一个需要4GB内存的程序,然后尝试在一个具有256MB内存的小型嵌入式设备上运行它,那么这也不会起作用


为了更好地适应您已经改变的问题:根据我的经验,Clang和gcc在可移植性方面应该没有太大区别。谷歌搜索也没有发现任何东西,所以它基本上应该是有效的。但是最好在生产中发布一些二进制文件之前测试这些东西。

如果程序是一个简单的Hello world,那么当通过Clang编译时,它应该可以在另一台机器上工作

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

  • 硬件要求(内存)不同(主要取决于编译选项)
  • 在gcc和clang之间使用不同(版本的)库
  • UB在其中一个方面给出预期结果,而在另一个方面没有给出预期结果
  • 实现定义规则的不同用法
  • clang不接受使用gcc扩展

对于除2之外的所有上述程序,首先,它应该在一台计算机上运行,如果程序是一个简单的Hello world,那么当通过Clang编译时,它应该在另一台计算机上运行

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

  • 硬件要求(内存)不同(主要取决于编译选项)
  • 在gcc和clang之间使用不同(版本的)库
  • UB在其中一个方面给出预期结果,而在另一个方面没有给出预期结果
  • 实现定义规则的不同用法
  • clang不接受使用gcc扩展

对于除2之外的所有上述内容,首先,它应该在它在一台机器上运行的其他机器上运行,只要您链接到相同的库,并且不向编译器传递像
-march=native
这样的标志,那么Clang binraries就和gcc二进制文件一样可移植

与gcc相比,Clang有一个巨大的优势,它可以处理大多数libstdc++版本, 而gcc绑定到它的捆绑版本,通常无法解析任何旧版本

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

  • 安装LTS发行版(例如Ubuntu 12.04)
  • 保持gcc、glibc和libstdc++不变
  • 安装C++11等的最新版本
  • 使用clang构建发行版二进制文件
因此(在我的具体示例中),这些二进制文件将在所有 libstdc++>=4.6和glibc>=2.15的发行版


对您来说,这可能是一本有趣的书。

只要您链接到相同的库,并且不向编译器传递类似于
-march=native
的标志,那么Clang binraries与gcc二进制文件一样可移植

与gcc相比,Clang有一个巨大的优势,它可以处理大多数libstdc++版本, 而gcc绑定到它的捆绑版本,通常无法解析任何旧版本

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

  • 安装LTS发行版(例如Ubuntu 12.04)
  • 保持gcc、glibc和libstdc++不变
  • 安装C++11等的最新版本
  • 建造