升级到gcc-4.9导致clang++出现故障。

最近我升级到了gcc-4.9,但是它完全破坏了我的clang++,导致我无法编译任何东西。我得到的错误信息是:

In file included from src/tester.cpp:11:
In file included from /usr/include/boost/progress.hpp:22:
In file included from /usr/include/boost/timer.hpp:20:
In file included from /usr/include/boost/config.hpp:40:
In file included from /usr/include/boost/config/select_stdlib_config.hpp:18:
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/cstddef:51:11: error: no member named 'max_align_t' in the global namespace
  using ::max_align_t;

clang++ -v 的输出:

Ubuntu clang version 3.4-1ubuntu3 (tags/RELEASE_34/final) (based on LLVM 3.4)
Target: x86_64-pc-linux-gnu
Thread model: posix
Found candidate GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/4.9
Found candidate GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/4.9.1
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8.2
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9.1
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/4.9
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/4.9.1
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8.2
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9.1
Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9

我尝试过卸载gcc和clang并重新安装,但没有帮助。 你有什么建议如何解决这个问题吗?

我遇到了同样愚蠢的问题 :-) - Gabriel
实际上,最后我解决了这个问题...但是关于解决方案,我真的不确定,因为我只是安装和移除了很多软件包...结果还好.. :-( 很抱歉,我不能提供更多有用的信息。 - Jendas
奇怪... :-) 希望它能在某个时候解决 - Gabriel
你是怎么解决的? - user
嗯,就像我写的那样...我安装和删除了很多软件包...已经过了一段时间了。试着删除与gcc有关的任何远程连接的软件包,或许最终会起作用。如果你找到了解决办法,请与我们分享。 - Jendas
2个回答

$ grep max_align_t /usr/include/c++/* -r
/usr/include/c++/4.9/cstddef: using ::max_align_t; /usr/include/c++/4.9.2/cstddef: using ::max_align_t; /usr/include/c++/v1/cstddef: max_align_t /usr/include/c++/v1/cstddef:typedef long double max_align_t;
/usr/include/c++/v1/ 是来自 libc++-dev 的文件,所以我们需要使用 clang 来使用 libc++
简单的编译器开关可以解决这个问题
所以如果你遇到这个错误,请在你的 clang 命令行中添加以下内容:-stdlib=libc++

现在已经有很长时间,clang和gcc之间存在着一个长期的ABI不兼容性错误。这个问题导致clang无法与现有的系统库链接。

好消息是(截至2016-07-27):在Xenial(16.04.1 LTS)中已经修复了

对于对细节感兴趣的人,上游错误如下:

  • {{link1:clang++不再与g++兼容}}
  • {{link2:请从Debian合并llvm-toolchain-3.8}}