编译llvm-6.0.0失败,疑编译器误判无异常时不支持生成unwind tables
解决LLVM 6.0.0编译时"禁用异常不支持生成unwind tables"的错误
我之前也碰到过一模一样的问题——LLVM 6.0.0的CMake检测逻辑对clang-5.0的支持判断存在bug,明明编译器本身能正常处理-fno-exceptions -funwind-tables组合,却被构建脚本误判。下面是我亲测有效的解决方法:
核心解决方案:手动强制CMake识别编译器能力
直接在CMake配置阶段,明确指定编译选项并覆盖LLVM的自动检测结果。假设你的LLVM源码放在../llvm-6.0.0.src,用Ninja构建,执行以下命令:
cmake -G Ninja \ -DCMAKE_C_COMPILER=clang-5.0 \ -DCMAKE_CXX_COMPILER=clang++-5.0 \ -DLLVM_ENABLE_EXCEPTIONS=OFF \ -DLLVM_ENABLE_UNWIND_TABLES=ON \ -DLLVM_ENABLE_LIBUNWIND=ON \ -DLIBCXXABI_USE_LLVM_UNWINDER=ON \ -DCMAKE_CXX_FLAGS="-fno-exceptions -funwind-tables" \ -DCMAKE_C_FLAGS="-funwind-tables" \ ../llvm-6.0.0.src
参数说明:
-DCMAKE_C/CXX_COMPILER:明确指定要使用的clang版本,避免系统默认编译器干扰检测结果-DLLVM_ENABLE_EXCEPTIONS=OFF:开启你需要的禁用异常配置-DLLVM_ENABLE_UNWIND_TABLES=ON:强制告诉构建系统我们要生成unwind tables,跳过不准确的自动检测-DLLVM_ENABLE_LIBUNWIND=ON和-DLIBCXXABI_USE_LLVM_UNWINDER=ON:解决"不支持构建依赖C++ ABI库运行时的libunwind DSO"的问题,明确让libunwind使用LLVM自身的unwinder实现CMAKE_C/CXX_FLAGS:直接传入你已经验证有效的编译选项,确保编译器按预期工作
额外注意事项
- 先安装必要依赖:Debian 9上执行
sudo apt-get install ninja-build libunwind-dev,避免因依赖缺失引发其他问题 - 如果之前运行过CMake,务必删除
build目录下的所有文件再重新配置,防止缓存的旧检测结果干扰新配置 - LLVM 6.0.0是比较老旧的版本,对clang-5.0的兼容性检测确实存在不完善的地方,手动指定参数是最直接的规避方案
内容的提问来源于stack exchange,提问作者JiaHao Xu
相关产品推荐
相关产品推荐

