假设我有一个C ++项目,我用gcc和clang编译它。您可以假设gcc编译版本在另一台Linux机器上运行。这是否意味着(在正常情况下)clang版本也将在另一台Linux机器上运行?
答案 0 :(得分:2)
如果程序是一个简单的Hello世界,它应该在通过Clang编译时在另一台机器上工作。
但是当程序是一个真正的程序,有很多行和编译单元,并且调用许多外部库时,一切都是可能的,这取决于程序本身和编译选项:
对于上述所有情况,除了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绑定到其捆绑版本,但通常无法解析任何旧版本。
因此,以下情况经常发生在生产环境中:
所以(在我的具体例子中)这些二进制文件将适用于所有
发布libstdc++ >= 4.6
和glibc >= 2.15
。
This对您来说可能是一本有趣的读物。