在Ubuntu中生成llvm源代码时发生致命错误

在Ubuntu中生成llvm源代码时发生致命错误,ubuntu,clang,llvm,llvm-clang,ninja,Ubuntu,Clang,Llvm,Llvm Clang,Ninja,我试图在Ubuntu 16.04上构建LLVM源代码。我已经试用了版本4.0.1、4.0.0和3.9.0,源代码来自。我还尝试使用svn的源代码,如一些教程所示 以下是我得到的错误: [1480/1747] Linking CXX executable bin/clang-3.9 FAILED: : && /usr/bin/c++ -fPIC -fvisibility-inlines-hidden -Wall -W -Wno-unused-parameter -Wwrite-

我试图在Ubuntu 16.04上构建LLVM源代码。我已经试用了版本4.0.1、4.0.0和3.9.0,源代码来自。我还尝试使用svn的源代码,如一些教程所示

以下是我得到的错误:

[1480/1747] Linking CXX executable bin/clang-3.9
FAILED: : && /usr/bin/c++   -fPIC -fvisibility-inlines-hidden -Wall -W -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic -Wno-long-long -Wno-maybe-uninitialized -Wdelete-non-virtual-dtor -Wno-comment -Werror=date-time -std=c++11 -fno-common -Woverloaded-virtual -fno-strict-aliasing -g  -Wl,-allow-shlib-undefined   -Wl,--export-dynamic tools/clang/tools/driver/CMakeFiles/clang.dir/driver.cpp.o tools/clang/tools/driver/CMakeFiles/clang.dir/cc1_main.cpp.o tools/clang/tools/driver/CMakeFiles/clang.dir/cc1as_main.cpp.o  -o bin/clang-3.9  lib/libLLVMAArch64CodeGen.a lib/libLLVMAArch64AsmPrinter.a lib/libLLVMAArch64AsmParser.a lib/libLLVMAArch64Desc.a lib/libLLVMAArch64Info.a lib/libLLVMAArch64Disassembler.a lib/libLLVMAMDGPUCodeGen.a lib/libLLVMAMDGPUAsmPrinter.a lib/libLLVMAMDGPUAsmParser.a lib/libLLVMAMDGPUDesc.a lib/libLLVMAMDGPUInfo.a lib/libLLVMAMDGPUDisassembler.a lib/libLLVMARMCodeGen.a lib/libLLVMARMAsmPrinter.a lib/libLLVMARMAsmParser.a lib/libLLVMARMDesc.a lib/libLLVMARMInfo.a lib/libLLVMARMDisassembler.a lib/libLLVMBPFCodeGen.a lib/libLLVMBPFAsmPrinter.a lib/libLLVMBPFDesc.a lib/libLLVMBPFInfo.a lib/libLLVMHexagonCodeGen.a lib/libLLVMHexagonAsmParser.a lib/libLLVMHexagonDesc.a lib/libLLVMHexagonInfo.a lib/libLLVMHexagonDisassembler.a lib/libLLVMMipsCodeGen.a lib/libLLVMMipsAsmPrinter.a lib/libLLVMMipsAsmParser.a lib/libLLVMMipsDesc.a lib/libLLVMMipsInfo.a lib/libLLVMMipsDisassembler.a lib/libLLVMMSP430CodeGen.a lib/libLLVMMSP430AsmPrinter.a lib/libLLVMMSP430Desc.a lib/libLLVMMSP430Info.a lib/libLLVMNVPTXCodeGen.a lib/libLLVMNVPTXAsmPrinter.a lib/libLLVMNVPTXDesc.a lib/libLLVMNVPTXInfo.a lib/libLLVMPowerPCCodeGen.a lib/libLLVMPowerPCAsmPrinter.a lib/libLLVMPowerPCAsmParser.a lib/libLLVMPowerPCDesc.a lib/libLLVMPowerPCInfo.a lib/libLLVMPowerPCDisassembler.a lib/libLLVMSparcCodeGen.a lib/libLLVMSparcAsmPrinter.a lib/libLLVMSparcAsmParser.a lib/libLLVMSparcDesc.a lib/libLLVMSparcInfo.a lib/libLLVMSparcDisassembler.a lib/libLLVMSystemZCodeGen.a lib/libLLVMSystemZAsmPrinter.a lib/libLLVMSystemZAsmParser.a lib/libLLVMSystemZDesc.a lib/libLLVMSystemZInfo.a lib/libLLVMSystemZDisassembler.a lib/libLLVMX86CodeGen.a lib/libLLVMX86AsmPrinter.a lib/libLLVMX86AsmParser.a lib/libLLVMX86Desc.a lib/libLLVMX86Info.a lib/libLLVMX86Disassembler.a lib/libLLVMXCoreCodeGen.a lib/libLLVMXCoreAsmPrinter.a lib/libLLVMXCoreDesc.a lib/libLLVMXCoreInfo.a lib/libLLVMXCoreDisassembler.a lib/libLLVMAnalysis.a lib/libLLVMCodeGen.a lib/libLLVMCore.a lib/libLLVMipo.a lib/libLLVMInstCombine.a lib/libLLVMInstrumentation.a lib/libLLVMMC.a lib/libLLVMMCParser.a lib/libLLVMObjCARCOpts.a lib/libLLVMOption.a lib/libLLVMScalarOpts.a lib/libLLVMSupport.a lib/libLLVMTransformUtils.a lib/libLLVMVectorize.a -lpthread lib/libclangBasic.a lib/libclangCodeGen.a lib/libclangDriver.a lib/libclangFrontend.a lib/libclangFrontendTool.a lib/libPolly.a lib/libLLVMGlobalISel.a lib/libLLVMAArch64Desc.a lib/libLLVMAArch64AsmPrinter.a lib/libLLVMAArch64Info.a lib/libLLVMAArch64Utils.a lib/libLLVMAMDGPUDesc.a lib/libLLVMAMDGPUAsmPrinter.a lib/libLLVMAMDGPUInfo.a lib/libLLVMAMDGPUUtils.a lib/libLLVMARMDesc.a lib/libLLVMARMAsmPrinter.a lib/libLLVMARMInfo.a lib/libLLVMBPFAsmPrinter.a lib/libLLVMHexagonDesc.a lib/libLLVMHexagonInfo.a lib/libLLVMMipsAsmPrinter.a lib/libLLVMMipsInfo.a lib/libLLVMMSP430AsmPrinter.a lib/libLLVMNVPTXAsmPrinter.a lib/libLLVMPowerPCAsmPrinter.a lib/libLLVMPowerPCInfo.a lib/libLLVMSparcAsmPrinter.a lib/libLLVMSparcInfo.a lib/libLLVMSystemZDesc.a lib/libLLVMSystemZAsmPrinter.a lib/libLLVMSystemZInfo.a lib/libLLVMX86AsmPrinter.a lib/libLLVMX86Utils.a lib/libLLVMX86Info.a lib/libLLVMXCoreAsmPrinter.a lib/libLLVMAsmPrinter.a lib/libLLVMDebugInfoCodeView.a lib/libLLVMSelectionDAG.a lib/libLLVMCodeGen.a lib/libLLVMXCoreInfo.a lib/libLLVMMCDisassembler.a lib/libclangCodeGen.a lib/libLLVMipo.a lib/libLLVMVectorize.a lib/libLLVMInstrumentation.a lib/libLLVMObjCARCOpts.a lib/libLLVMScalarOpts.a lib/libLLVMInstCombine.a lib/libLLVMTarget.a lib/libLLVMBitWriter.a lib/libLLVMIRReader.a lib/libLLVMAsmParser.a lib/libLLVMLinker.a lib/libLLVMTransformUtils.a lib/libLLVMAnalysis.a lib/libLLVMCoverage.a lib/libLLVMObject.a lib/libclangRewriteFrontend.a lib/libclangARCMigrate.a lib/libclangStaticAnalyzerFrontend.a lib/libclangFrontend.a lib/libclangDriver.a lib/libLLVMOption.a lib/libLLVMProfileData.a lib/libclangParse.a lib/libLLVMMCParser.a lib/libclangSerialization.a lib/libLLVMBitReader.a lib/libclangSema.a lib/libclangEdit.a lib/libclangStaticAnalyzerCheckers.a lib/libclangStaticAnalyzerCore.a lib/libclangAnalysis.a lib/libclangAST.a lib/libclangRewrite.a lib/libclangLex.a lib/libclangBasic.a lib/libLLVMCore.a lib/libLLVMMC.a lib/libLLVMSupport.a -lrt -ldl -ltinfo -lpthread -lz -lm lib/libPollyISL.a -Wl,-rpath,"\$ORIGIN/../lib" && :
collect2: fatal error: ld terminated with signal 9 [Killed]
这在我尝试的三个版本中都是一个反复出现的错误,所以可能是我遗漏了某个步骤或者其他一些问题

以下是我的步骤:

  • 下载llvm
  • 下载clang、lld和polly并放入llvm/tools
  • 下载编译器rt、openmp、libcxx、libcxxabi和测试套件,并放入llvm/项目中
  • 运行
    cmake-G Ninja-DLLVM_ENABLE_ASSERTIONS=On..
  • 运行忍者-j4

  • 我不知道如何删除这个错误,也没有任何LLVM的经验。请解释错误的原因

    这可能是由于链接步骤使用了太多内存造成的。在我的系统上启用了足够的交换空间,这使得系统实际上无法使用,因为交换空间位于HDD上。否则,Linux内核将根据一种启发式方法杀死一些进程,这种启发式方法可能涉及追踪最大的内存用户,这可以解释您的问题(ld被杀死)

    如果您有大约8GB的RAM,那么最多可以并行完成一个链接作业。默认情况下,llvm是使用静态库构建的,这会导致链接占用过多的内存(由于调试信息)。然后通常几个大的可执行文件会被忍者并行链接,你的系统会耗尽内存

    尝试将
    -DLLVM\u PARALLEL\u LINK\u JOBS=1
    添加到cmake调用中

    还有一个构建共享库的选项可以缓解这个问题,我认为它是
    -DLLVM\u LINK\u LLVM\u DYLIB=true

    有关CMake选项的更多信息,请参见:

    我认为使用黄金链接器也有帮助,因为它比默认链接器更高效。它通过将-DLLVM_USE_LINKER=gold传递给cmake来启用

    最后,发布版本不包含调试信息,这会占用大量内存,所以构建时应该占用更少的内存

    更新: 我最近遇到了一个例子,它以LLVM为例描述了如何使用split dwarf来加速编译。通过将调试信息与链接的对象文件分离,这有助于减少链接器的内存消耗。
    对于LLVM,通过将选项
    -DLLVM\u USE\u split\u dwarf=ON
    传递给cmake来启用分割矮星。

    我在线查看了更多信息,人们说创建更多交换空间也会有所帮助。我有5.4G的交换空间和8G的RAM。这就足够了吗?当我上次在笔记本电脑上尝试时,我可以用8GB的RAM进行构建,但我将作业限制为1,并使用黄金链接器。当时,我不知道如何有选择地设置链接作业的数量,这会更快,因为编译可以并行进行。我在构建LLVM时交换的经验是,我的系统变得完全不可用。几个小时后我不得不关掉它。因此,我不建议为此仅依赖交换空间。构建(如果完成)可能需要几天时间。如何使用黄金链接器?请尝试将-DCMAKE_EXE_linker_FLAGS='-fuse ld=/usr/bin/gold'添加到cmake调用中。我现在无法检查cmake调用,但是使用-fuse ld=linker,您可以告诉g++使用“linker”作为链接器。Cmake将使用编译器作为链接器,以确保运行时链接正确,然后使用正确的参数调用链接器。答案可能对你的情况也有帮助。请看我的答案。