对于C+,Clang是否比gcc更具可移植性+;? 假设我有一个C++项目,我用GCC和CLAN编译它。您可以假设gcc编译版本在另一台linux机器上运行。这是否意味着(在正常情况下)clang版本也将在其他linux机器上运行?
linux程序取决于其构建环境。如果您的glibc版本或内核不同,那么有很多可能无法运行可执行文件。您可以使用llvm的解释器语言,它编译成字节码,可以在各种操作系统上进行解释。linux程序取决于它们的构建环境。如果您的glibc版本或内核不同,那么有很多可能无法运行可执行文件。不过,您可以使用llvm的解释器语言,它编译成字节码,可以在各种操作系统上进行解释。答案是,嗯,这取决于具体情况 第一个硬需求是相同的CPU架构。64位是不够的限定符。如果编译x64,那么在64位ARM上运行它不会有多大成功 下一个大问题是图书馆。如果在程序中使用任何库,目标系统需要这些库。这包括内核头。因此,如果您使用最先进的功能为当前的内核版本进行编译,那么在非常旧的Linux版本上运行该程序将毫无乐趣 最后一个是硬件依赖性。如果您创建了一个需要4GB内存的程序,然后尝试在一个具有256MB内存的小型嵌入式设备上运行它,那么这也不会起作用对于C+,Clang是否比gcc更具可移植性+;? 假设我有一个C++项目,我用GCC和CLAN编译它。您可以假设gcc编译版本在另一台linux机器上运行。这是否意味着(在正常情况下)clang版本也将在其他linux机器上运行?,clang,Clang,linux程序取决于其构建环境。如果您的glibc版本或内核不同,那么有很多可能无法运行可执行文件。您可以使用llvm的解释器语言,它编译成字节码,可以在各种操作系统上进行解释。linux程序取决于它们的构建环境。如果您的glibc版本或内核不同,那么有很多可能无法运行可执行文件。不过,您可以使用llvm的解释器语言,它编译成字节码,可以在各种操作系统上进行解释。答案是,嗯,这取决于具体情况 第一个硬需求是相同的CPU架构。64位是不够的限定符。如果编译x64,那么在64位ARM上运行它不会有多
为了更好地适应您已经改变的问题:根据我的经验,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构建发行版二进制文件
对您来说,这可能是一本有趣的书。只要您链接到相同的库,并且不向编译器传递类似于
-march=native
的标志,那么Clang binraries与gcc二进制文件一样可移植
与gcc相比,Clang有一个巨大的优势,它可以处理大多数libstdc++版本,
而gcc绑定到它的捆绑版本,通常无法解析任何旧版本
因此,在生产环境中经常会发生以下情况:
- 安装LTS发行版(例如Ubuntu 12.04)
- 保持gcc、glibc和libstdc++不变
- 安装C++11等的最新版本
- 建造