我的项目目前正在gcc下进行编译。它使用Boost,ZeroMQ作为静态.a
库以及某些.so
库(例如SDL)。我想一直走,但不是现在。我想知道是否可以编译使用clang和clang编译的使用代码.a
和.so
库?
是的,您通常可以使用clang
GCC编译的库(反之亦然,可以gcc
使用CLANG编译的库),因为实际上它不是编译而是相关的链接。您可能不走运,得到不愉快的惊喜。
原则上,您可以依赖于libstdc++
用于链接相关库的版本(如果它们是用C ++编码的)。实际上,这通常并不重要。
从理论上讲,在C ++中,名称重整可能是一个问题(可能存在一些极端情况,甚至是的两个不同版本之间的不兼容g++
)。同样,在实践中,这通常不是问题。
因此,通常您可以将CLANG(甚至它的不同版本,也可以是接近版本)与GCC混合使用,但是您可能会感到不愉快。任何C ++编译器(无论是CLANG还是GCC)都应该期望能够使用相同的编译器和版本(包括相同的C ++标准库 实现)将整个软件(和所有库)编译并链接在一起。。这就是为什么在发行版中升级编译器需要大量工作的原因:发行版制造商必须确保所有软件包都能良好地编译(它们确实会带来意外!)。
注意libstdc ++的版本确实很重要。Clang和GCC社区都在努力使其ABI与编译器升级兼容,但是存在一些微不足道的情况。阅读特定和特定的C ++标准库实现的文档。这些极端的情况可以解释在GCC 8编译的代码中使用良好的C ++库二进制文件(与GCC 5编译)时发生的神秘崩溃。该错误不在库中,而是ABI不兼容地演变。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句