gcc vs clang常见库问题

时间:2018-04-08 07:20:37

标签: c++ gcc clang++

我有两个应用程序,一个用gcc(c ++)编译,另一个用clang ++编译。我将为这两个应用程序使用通用的共享boost库。我的问题是是否使用clang编译器或gcc编译器编译boost共享库。我可以在使用clang编译的应用程序中使用使用gcc编译的boost库吗?

3 个答案:

答案 0 :(得分:4)

g ++和clang ++兼容编译器(因为它们都遵循Itanium ABI),但它们可能带有不兼容的标准库实现。

g ++附带了一个名为libstdc ++的标准库实现。您可以指示g ++使用不同的实现,但这并非完全无关紧要。

clang ++有时没有自己的标准库实现(并且配置为使用g ++提供的实现),有时会附带一个名为libc ++的实现。可以通过单个命令行选项轻松切换clang ++以使用libc ++或libstdc ++。

因此,您的问题归结为您的应用程序使用的标准库实现。如果他们使用相同的实现,则需要使用该实现(以及任一编译器)构建Boost。如果他们使用不同的实现,yoy需要两个独立的Boost构建。

在同一个应用程序中混合使用针对不同标准库实现构建的组件有时可以完成,但不是直截了当,需要很多限制,而像boost这样的东西要么不可行要么完全不可能

答案 1 :(得分:0)

您需要为每个应用程序使用两个单独的 boost 构建,除非 boost 使用仅限于动态库中,然后由这些应用程序链接,并且所述动态库不会从 c++ std 导出类型里面的图书馆

答案 2 :(得分:-2)

简短回答:也许,也许不是。

答案很长:

C ++标准(或任何其他标准)并不能保证这种用法。

Clang的开发人员确实在努力使Clang和GCC兼容,但最明显的是(它是一个不同的编译器!)和一些不那么明显的原因(例如对C ++规范含义的理解上的细微差别),它们不是相同的编译器,因此可以在几个方面做不同的事情。

不兼容的最明显原因是:

  • 类型定义的差异。 size_tintlong之类的内容可能没有相同的定义,因此使用int func()编译的函数可能不会在两个编译器中返回相同的大小值。
  • 名称差异的差异。例如,编译器如何区分func(int)func(long)
  • 调用约定的差异。如何传递和返回参数 - 参数是在寄存器中还是在堆栈中,寄存器的顺序是从第一个到最后一个寄存器参数中选取的,等等。
  • 异常处理的差异。编译器如何生成代码以解决代码中特定位置抛出的异常,并展开回最近的catch语句。

这绝不是

的完整列表

上面的一些差异也可能取决于编译代码的目标 - 例如,它可能在x86上完全正常,但是为PowerPC编译,并且在某处存在一些差异。

我不相信任何人能够最终确定地说'#34;是的,这将有效"或者"没有它赢了&#t;#34;。我经常使用clang和gcc的混合编译代码,它几乎一直都在工作。但这并不意味着它一直适用于所有事物的所有情况。而这才是真正的问题。

如果你有一个好的测试套件[如果没有,你可能应该修复它],你可以验证所有(测试的)代码是否按预期工作。这是一个比#34更好的保证;某些互联网页面上有人写道它可以正常运行,因为它会以你使用它的方式测试你正在使用的东西。