我的项目目前正在 gcc 下编译。它使用 Boost、ZeroMQ 作为静态 .a
库和一些 .so
库,如 SDL。我想一路叮当响,但不是现在。我想知道是否可以编译使用在 gcc 下用 clang 编译的 .a
和 .so
库的代码?
最佳答案
是的,您通常可以将clang
与GCC编译的库一起使用(反之亦然,将gcc
与CLANG编译的库一起使用),因为在事实上它不是编译而是linking这是相关的。你可能会倒霉,得到不愉快的惊喜。
原则上,您可以依赖于用于链接相关库的 libstdc++
版本(如果它们是用 C++ 编码的)。实际上,这通常无关紧要。
在 C++ 中,name mangling理论上可能是一个问题(可能存在一些极端情况,甚至两个不同版本的 g++
之间不兼容)。同样,在实践中这通常不是问题。
所以通常你可以将 CLANG(甚至是它的不同但接近的版本)与 GCC 混合使用,但你可能会有不愉快的惊喜。任何 C++ 编译器(无论是 CLANG 还是 GCC)都应该能够使用相同的编译器和版本(包括相同的 C++ standard library 实现)。这就是为什么在发行版中升级编译器需要大量工作的原因:发行版制造商必须确保所有包都能很好地编译(他们确实会得到惊喜!)。
注意 libstdc++ 的版本很重要。 Clang 和 GCC 社区都在努力使其 ABI 与编译器升级兼容,但也存在一些微妙的极端情况。阅读您的特定 C++ 标准库实现的文档。这些极端情况可以解释在使用 GCC 8 编译的代码中使用良好的 C++ 库二进制文件(使用 GCC 5 编译)时发生的神秘崩溃。错误不在库中,但 ABI 进化不兼容。
关于linux - Clang 可以使用 GCC 编译的 .a 库编译代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20875924/