Ubuntu20.04用GCC11编译LLVM13出现MPFR Wrapper模板特化报错
错误原因
这个编译错误是GCC 11收紧了C语法合规性检查导致的:你编译的LLVM 13.0.0版本的libc代码中存在不符合C标准的写法——在MPFRNumber类的内部直接显式特化成员模板函数as<T>(),C++标准明确要求成员模板的显式特化必须定义在命名空间作用域下,不能放在类内部。旧版本GCC对这类非标准写法做了兼容允许编译通过,GCC 11默认开启了更严格的标准检查,就会抛出你遇到的报错。
解决方法
- 如果你不需要使用LLVM自带的libc,直接在CMake配置参数中添加
-DLLVM_ENABLE_LIBC=OFF跳过libc组件的编译即可,这是成本最低的解决方案,绝大多数场景下使用LLVM不需要编译其自带的libc。 - 如果你确实需要编译LLVM libc,可选择两种方案:
- 降级编译器为GCC 10.x版本,GCC 10对该类非标准写法保留了兼容,可以正常编译LLVM 13.0.0的libc代码
- 手动修改报错的
libc/utils/MPFRWrapper/MPFRUtils.cpp文件:将类内部三个显式特化的as<float>()/as<double>()/as<long double>()函数移出类定义,放到__llvm_libc::testing::mpfr命名空间作用域下定义即可,修改量极小,改完即可正常编译。
末尾关于getMPFRRoundingMode的警告是次要问题,只是函数逻辑没有覆盖所有枚举值分支导致没有返回值,不阻断编译,在意的话可以在函数末尾添加默认返回值即可解决。
内容的提问来源于stack exchange,提问作者Liam Clink
相关产品推荐
相关产品推荐

