Ubuntu 17.04下用Clang 4.0编译LLVM 3.42失败求助
解决Clang 4.0编译LLVM 3.4.2的两个关键错误
针对你遇到的两阶段编译错误,我整理了针对性的解决思路和实操方案:
一、第一阶段:__msan_allocated_memory 未定义引用错误
这个问题源于LLVM 3.4.2作为老旧版本,和Clang 4.0的MemorySanitizer(MSan)实现存在兼容性差异,代码中引用了MSan的符号但链接阶段无法找到对应库。
你可以尝试以下两种方案:
- 方案1:禁用compiler-rt或MSan支持
如果你不需要compiler-rt组件,直接去掉脚本中svn co compiler-rt的步骤即可;如果需要compiler-rt但不需要MSan,在configure时添加参数:
或者在make时传递禁用宏:--disable-compiler-rtmake -j$(nproc) DISABLE_MSAN=1 - 方案2:跳过MSan相关模块编译
手动修改LLVM的CMake配置,排除MSan相关的编译目标,不过这种方式相对繁琐,优先推荐方案1。
二、第二阶段:malloc/calloc等函数声明冲突错误
这个问题出在compiler-rt的ThreadSanitizer(TSan)代码中,系统malloc.h和C++标准库stdlib.h对内存分配函数的声明重复,导致Clang抛出冲突错误。
推荐以下几种解决方式:
- 方案1:修改TSan源码的头文件包含逻辑
打开llvm/projects/compiler-rt/lib/tsan/rtl/tsan_platform_linux.cc,找到第47行包含malloc.h的代码,修改为:#define _GNU_SOURCE #include <malloc.h>_GNU_SOURCE宏会调整头文件的声明逻辑,避免重复定义冲突。 - 方案2:禁用TSan编译
如果你不需要ThreadSanitizer功能,在configure时添加参数关闭它:
或者在make时传递禁用参数:--enable-compiler-rt --disable-tsanmake -j$(nproc) DISABLE_TSAN=1 - 方案3:调整编译选项
给compiler-rt的编译添加-fno-builtin选项,让编译器不把malloc/calloc等识别为内置函数,避免声明冲突。可以修改compiler-rt的CMakeLists.txt,添加:set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-builtin") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-builtin")
最后补充一点:LLVM 3.4.2是2014年的老旧版本,和Clang 4.0以及你当前系统的GCC 6.3头文件环境存在大量兼容性问题。如果条件允许,建议升级LLVM到更近期的稳定版本,或者使用和LLVM 3.4.2匹配的旧版Clang(比如Clang 3.4)编译,能从根源上避免这类问题。
内容的提问来源于stack exchange,提问作者OrenIshShalom
相关产品推荐
相关产品推荐

