Ubuntu 17.04下编译LLVM/Clang 3.42源码失败求助
你遇到的问题本质是LLVM 3.4.2(非常老旧的版本)与Ubuntu 17.04默认的GCC 6.3不兼容,核心原因是GCC 6.x默认启用了C14标准,而LLVM 3.4.2是基于旧版C标准开发的,导致系统头文件中的using声明与重复的函数定义产生冲突。
问题分析
错误信息里明确显示:GCC的C标准库头文件(/usr/include/c++/6.3.0/stdlib.h)通过using std::malloc;引入了标准库的malloc函数,而系统的malloc.h又再次声明了相同的函数,两者在C14标准下触发了声明冲突。这种情况在旧版GCC(比如Ubuntu 14.04的GCC 4.8)中不会出现,因为当时默认的C标准是C03,头文件的处理逻辑不同。
解决方案
这里有几个可行的解决办法,按推荐优先级排序:
1. 强制使用旧版C++标准编译
在configure阶段指定C标准为C03(LLVM 3.4.2开发时的主流标准),同时指定C标准为C99,这样可以避免新标准带来的头文件冲突:
cd llvm ./configure \ --enable-optimized \ --disable-assertions \ --enable-targets=host \ --with-python="/usr/bin/python2" \ CXXFLAGS="-std=c++03" \ CFLAGS="-std=c99" make -j `nproc`
这个方法不需要修改源码,也不需要降级编译器,是最便捷的方案。
2. 降级GCC到兼容版本
如果第一种方法无效,可以尝试安装Ubuntu 14.04使用的GCC 4.8,强制用旧编译器编译:
# 安装GCC 4.8 sudo apt-get update && sudo apt-get install gcc-4.8 g++-4.8 # 指定编译器重新configure cd llvm ./configure \ --enable-optimized \ --disable-assertions \ --enable-targets=host \ --with-python="/usr/bin/python2" \ CC="/usr/bin/gcc-4.8" \ CXX="/usr/bin/g++-4.8" make -j `nproc`
3. 修改TSAN源码屏蔽冲突(不推荐)
如果必须使用GCC 6.3且需要保留compiler-rt的TSAN模块,可以修改报错的源码文件llvm/projects/compiler-rt/lib/tsan/rtl/tsan_platform_linux.cc,在包含malloc.h的地方添加条件编译,避免在C++11及以上标准下引入该头文件:
// 找到原有的#include <malloc.h>,替换为: #if !defined(__cplusplus) || (__cplusplus < 201103L) #include <malloc.h> #endif
这种方法需要修改源码,后续维护成本较高,仅作为备选方案。
总结
LLVM 3.4.2是2014年的旧版本,对新的编译器和系统支持有限。如果长期需要编译该版本,建议优先使用指定旧C++标准的方法;如果条件允许,升级到更高版本的LLVM(比如5.0及以上)会从根本上解决这类兼容性问题。
内容的提问来源于stack exchange,提问作者OrenIshShalom

