linux - Clang 可以使用 GCC 编译的 .a 库编译代码吗?

标签 linux gcc clang static-libraries static-linking

我的项目目前正在 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/

相关文章:

gcc - C++ 共享库符号版本控制

c++ - gtkmm 链接器错误

c++ - 我怎样才能让 GCC/Clang 警告使用未初始化的成员?

c - 是否有一个C代码片段,可以在不使用编译器内置函数的情况下有效地计算溢出安全加法?

c++ - 如何以编程方式获取 Linux 中目录的可用磁盘空间

linux - 如何根据下一行中的内容来 grep 行?

linux - 在 Debug模式下加载libglib时 "error: symbol lookup error: undefined symbol:"的意义是什么?

c - 使用 dlsym() 在静态链接库中查找变量

linux - nohup 进程在 xterm 关闭时终止,但在退出时不终止

c++ - 建立LLVM 10 C++工具链的问题