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

标签 ubuntu gcc llvm

尝试在 ubuntu 17.04 上构建 llvm/clang 3.42 时,
如前所述,我使用 configre+make 失败了 in this SO post .
我用这个非常相似的脚本给了 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

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

最佳答案

您正面临编译器崩溃:

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

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

有几种方法可以解决这个问题:
  • 一种选择——如果你有这种灵 active ——是更改编译器版本,无论是更新到更新的版本,还是完全更改为不同的 C++ 编译器。

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

    不同的编译器因相同的输入而崩溃的机会非常罕见,因此希望使用 clang。或者,您可以尝试更新的 gcc 版本,例如 7.2 .
  • 如果您无法更改编译器,您可以尝试绕过崩溃,通过更改崩溃文件的编译器标志 - 例如,从 -O2 降低优化级别至-O0 (通常试图放松帮助编译器成功的场景)。

    为了查明崩溃文件​​,最好删除 -j来自 make 的标志, 这样它就只能使用一个编译器进程顺序运行,因此崩溃文件将是最后一个编译的文件,并且不会混淆哪个文件导致编译器崩溃。
  • 从命令行更改编译器标志的一个快速简单的替代方法是使用 optimize pragma,它允许您在源文件本身中指定优化标志,从而使您免于修补构建系统(这可能会很痛苦)。

    优化编译指示的 GCC 语法是:#pragma GCC optimize ("string" ...) .

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

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

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

    祝你好运!

    关于ubuntu - 从源代码构建 llvm 3.42 时 gcc 崩溃(使用 cmake),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48149250/

    相关文章:

    python-3.x - Pyautogui 不会移动实际的鼠标指针

    c++ - gcc include命令坏了?

    c - Linux 上的线程局部变量访问速度有多快

    c++ - LLVM cpp 后端,它会取代 c 后端吗?

    llvm - 是否可以在没有 clang 的情况下将 LLIR 编译为二进制文件?

    ubuntu - tomcat [Ubuntu] - 警告 : The selected directory is not a valid Tomcat home

    python包没有安装在使用ubuntu的虚拟环境中

    c++ - FFmpeg Ubuntu 链接器错误

    c - gcc -ffp-contract 选项的区别

    virtual-machine - 像 LLVM 或 PARROT 这样的 VM 是否允许使用多种语言的同一个库?