从源代码构建llvm 3.42时gcc崩溃(使用cmake)

时间:2018-01-08 11:19:56

标签: ubuntu gcc llvm

尝试在ubuntu 17.04上构建llvm / clang 3.42, 我提到的in this SO post提到了configre + make失败了。 我用这个非常相似的剧本给了cmake一个镜头:

#!/bin/bash
###############
# DEFINITIONS #
###############
LLVM_SVN=https://llvm.org/svn/llvm-project
TAG=tags/RELEASE_342/final

###############
# DIRECTORIES #
###############
BASEDIR=/home/oren/GIT/myLLVMpass

###############
# DIRECTORIES #
###############
LLVM_DIR=${BASEDIR}/llvm-3.4.2
LLVM_BUILD_DIR=${LLVM_DIR}/build
LLVM_SRC_DIR=${LLVM_DIR}/llvm
CLANG_SRC_DIR=${LLVM_SRC_DIR}/tools/clang
COMPILER_RT_SRC_DIR=${LLVM_SRC_DIR}/projects/compiler-rt
LIBCXX_SRC_DIR=${LLVM_SRC_DIR}/projects/libcxx

#########################################################
# Prepare llvm, llvm/src and llvm/build directories ... #
#########################################################
mkdir ${LLVM_DIR}
mkdir ${LLVM_SRC_DIR}
mkdir ${LLVM_BUILD_DIR}

##################
# Get llvm 3.4.2 #
##################
svn co ${LLVM_SVN}/llvm/${TAG}        ${LLVM_SRC_DIR}
svn co ${LLVM_SVN}/cfe/${TAG}         ${CLANG_SRC_DIR}
svn co ${LLVM_SVN}/compiler-rt/${TAG} ${COMPILER_RT_SRC_DIR}
svn co ${LLVM_SVN}/libcxx/${TAG}      ${LIBCXX_SRC_DIR}

#################################
# No changes will be needed ... #
#################################
rm -rf ${LLVM_DIR}/.svn
rm -rf ${CLANG_DIR}/.svn
rm -rf ${COMPILER_RT_DIR}/.svn
rm -rf ${LIBCXX_DIR}/.svn

#####################################################
# Get inside the llvm/build directory and cmake ... #
#####################################################
cd ${LLVM_BUILD_DIR} && cmake ${LLVM_SRC_DIR}

###############
# make it !!! #
###############
make -j

我在configure + make试用版中遇到了完全不同的错误

[ 78%] Building CXX object lib/Target/ARM/CMakeFiles/LLVMARMCodeGen.dir/Thumb1FrameLowering.cpp.o
[ 78%] Building CXX object lib/Target/ARM/CMakeFiles/LLVMARMCodeGen.dir/ARMTargetObjectFile.cpp.o
[ 78%] Building CXX object lib/Target/ARM/CMakeFiles/LLVMARMCodeGen.dir/MLxExpansionPass.cpp.o
[ 78%] Building CXX object lib/Target/ARM/CMakeFiles/LLVMARMCodeGen.dir/Thumb2InstrInfo.cpp.o
c++: internal compiler error: Killed (program cc1plus)
Please submit a full bug report, with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-6/README.Bugs> for instructions.
tools/clang/lib/ASTMatchers/Dynamic/CMakeFiles/clangDynamicASTMatchers.dir/build.make:134: recipe for target 'tools/clang/lib/ASTMatchers/Dynamic/CMakeFiles/clangDynamicASTMatchers.dir/Registry.cpp.o' failed
make[2]: *** [tools/clang/lib/ASTMatchers/Dynamic/CMakeFiles/clangDynamicASTMatchers.dir/Registry.cpp.o] Error 4
CMakeFiles/Makefile2:15102: recipe for target 'tools/clang/lib/ASTMatchers/Dynamic/CMakeFiles/clangDynamicASTMatchers.dir/all' failed
make[1]: *** [tools/clang/lib/ASTMatchers/Dynamic/CMakeFiles/clangDynamicASTMatchers.dir/all] Error 2

这里发生了什么? 非常感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:1)

您正面临编译器崩溃:

c++: internal compiler error: Killed (program cc1plus)
Please submit a full bug report, with preprocessed source if appropriate.

这基本上是一个编译器错误 - 编译器应该永远不会崩溃,即使面对错误的输入。

有几种方法可以解决这个问题:

  • 一个选项 - 如果您具有这种灵活性 - 正在更改编译器版本,无论是更新到更新版本,还是更改为完全不同的C ++编译器。

    由于使用gcc(cc1plus)发生崩溃,我建议更改为clang,这是一个非常好的选择。 clang与gcc非常兼容,通常可以作为替代品使用。由于您正在构建LLVM,因此您很可能能够顺利构建clang(因为构建LLVM / clang对于clang的构建过程是不可或缺的)。

    不同编译器因同一输入而崩溃的可能性非常少,因此有希望使用clang。或者,您可以尝试更新的gcc版本,例如7.2

  • 如果您无法更改编译器,可以尝试通过更改崩溃文件的编译器标志来解决崩溃问题 - 例如,将优化级别从-O2降低到{{ 1}}(通常试图放松帮助编译器成功的场景)。

    为了精确定位崩溃文件,最好从-O0中删除-j标志,以便它只使用一个编译器进程连续运行,因此崩溃文件将是最后一个编译,并没有混淆哪个文件导致编译器崩溃。

  • 从命令行更改编译器标志的快速简便方法是使用make编译指示执行此操作,该编译指示允许您在源文件本身中指定优化标记,从而使您无需修补构建系统(这可能是一种痛苦)。

    优化编译指示的GCC语法是:optimize

    您可以简单地将编译指示放在源文件的顶部,在包含之后,它将影响该文件中的所有函数。

    请注意,大多数现代编译器都支持#pragma GCC optimize ("string" ...)编译指示,但旧编译器(例如GCC 4.8及更早版本)可能无法使用它。

总结一下 - 我的第一个建议是从默认包(optimize)安装clang,并将其指定为apt-get install clangconfigureCC=clang的编译器)。
或者,如果您可以更改LLVM的源代码并且更喜欢快速而肮脏的修复,CXX=clang++可能会完成工作。

祝你好运!

相关问题