架构的未定义符号 x86_64:"std::terminate()",在构建万花筒 llvm 时

Undefined symbols for architecture x86_64: "std::terminate()", when building kaleidoscope llvm

我正在做万花筒教程。我正在进行第二步。

https://github.com/westymatt/creole

但是我在用 clang++ 构建时遇到这个错误

clang++ -Wno-c++11-extensions -g -std=c++11  -I/usr/local/Cellar/llvm/3.6.1/include    -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS src/lexer.cc src/parser.cc -L/usr/local/Cellar/llvm/3.6.1/lib/ -lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMCodeGen -lLLVMScalarOpts -lLLVMProfileData -lLLVMInstCombine -lLLVMTransformUtils -lLLVMipa -lLLVMAnalysis -lLLVMTarget -lLLVMX86Desc -lLLVMObject -lLLVMMCParser -lLLVMBitReader -lLLVMMCDisassembler -lLLVMX86Info -lLLVMX86AsmPrinter -lLLVMMC -lLLVMX86Utils -lLLVMCore -lLLVMSupport -lc++ -O0 -o creole
Undefined symbols for architecture x86_64:
  "std::terminate()", referenced from:
      ___clang_call_terminate in lexer-608bbc.o
      ___clang_call_terminate in parser-09b617.o
ld: symbol(s) not found for architecture x86_64

According to this 你需要确保你的函数实现都有相应的声明。

std::terminate 位于 OSX 上的 libc++ 内部(我假设您正在使用它,因为那里的路径中有 "Cellar")。您似乎明确 linking 反对 libc++,这意味着您的 link 行上的顺序可能出错。

我无法使用树顶部的实际教程源来复制它(我没有签出 3.6.1),但我建议您按照其中的示例 Makefile 进行操作。教程给定部分的 link 行如下所示:

clang++ -Wl,-dead_strip -rdynamic -Wl,-rpath -Wl,@executable_path/../lib -L/Users/echristo/builds/build-llvm/Debug+Asserts/lib -L/Users/echristo/builds/build-llvm/Debug+Asserts/lib -m64 -o /Users/echristo/builds/build-llvm/Debug+Asserts/examples/Kaleidoscope-Ch4 /Users/echristo/builds/build-llvm/examples/Kaleidoscope/Chapter4/Debug+Asserts/toy.o \ -lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMCodeGen -lLLVMScalarOpts -lLLVMProfileData -lLLVMInstCombine -lLLVMInstrumentation -lLLVMTransformUtils -lLLVMipa -lLLVMX86Desc -lLLVMMCDisassembler -lLLVMX86Info -lLLVMX86AsmPrinter -lLLVMX86Utils -lLLVMMCJIT -lLLVMExecutionEngine -lLLVMTarget -lLLVMAnalysis -lLLVMRuntimeDyld -lLLVMObject -lLLVMMCParser -lLLVMBitReader -lLLVMMC -lLLVMCore -lLLVMSupport -lz -lpthread -ledit -lcurses -lm

这应该让您了解它的外观。

通过查看您在 github 上的来源,您似乎去了一个 "include the output of llvm-config on the command line",这不是很可靠,因为组件可能会发生变化,等等。

clang++ -g -O3 toy.cpp `llvm-config --cxxflags --ldflags --system-libs --libs core` -o toy

教程中的内容应该足以编译您的简单示例。只需将 toy.cpp 替换为您的两个示例文件,因为您将其拆分。

我在将我的代码与使用 ARC 构建的静态库链接时出现此错误,但有一些 Objective C 扩展名为 .mm 的文件。当我用 .m 重命名它们时,效果很好。