สร้างตัวอย่าง LLVM: สัญลักษณ์ที่ไม่ได้กำหนดสำหรับสถาปัตยกรรม x86_64

ฉันติดตั้ง LLVM บนแล็ปท็อปแล้ว แต่มีปัญหาในการคอมไพล์ตัวอย่าง Fibonacci ใน llvm/examples/Fibonacci:

เสียงดังกราว++ -std=c++11 -I ../../include fibonacci.cpp -o fib

/usr/local/include/llvm/Support/DataTypes.h:57:3: error: "Must #define __STDC_LIMIT_MACROS before #including Support/DataTypes.h"

ตามคำถามนี้ ฉัน เพิ่มแฟล็กไดรเวอร์:

เสียงดังกราว++ fibonacci.cpp -std=c++11 -I ../../include -o fib -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS

เกิดข้อผิดพลาดที่แตกต่างกัน:

Undefined symbols for architecture x86_64:
  "_LLVMInitializeX86Target", referenced from:
      llvm::InitializeNativeTarget() in fibonacci-1b0cd0.o
  "_LLVMInitializeX86TargetInfo", referenced from:
      llvm::InitializeNativeTarget() in fibonacci-1b0cd0.o
  "_LLVMInitializeX86TargetMC", referenced from:
      llvm::InitializeNativeTarget() in fibonacci-1b0cd0.o
  "_LLVMLinkInInterpreter", referenced from:
      (anonymous namespace)::ForceInterpreterLinking::ForceInterpreterLinking() in fibonacci-1b0cd0.o
  "llvm::BasicBlock::BasicBlock(llvm::LLVMContext&, llvm::Twine const&, llvm::Function*, llvm::BasicBlock*)", referenced from:
      llvm::BasicBlock::Create(llvm::LLVMContext&, llvm::Twine const&, llvm::Function*, llvm::BasicBlock*) in fibonacci-1b0cd0.o
  "llvm::BranchInst::BranchInst(llvm::BasicBlock*, llvm::BasicBlock*, llvm::Value*, llvm::BasicBlock*)", referenced from:
      llvm::BranchInst::Create(llvm::BasicBlock*, llvm::BasicBlock*, llvm::Value*, llvm::BasicBlock*) in fibonacci-1b0cd0.o
  "llvm::ReturnInst::ReturnInst(llvm::LLVMContext&, llvm::Value*, llvm::BasicBlock*)", referenced from:
      llvm::ReturnInst::Create(llvm::LLVMContext&, llvm::Value*, llvm::BasicBlock*) in fibonacci-1b0cd0.o
  "llvm::VectorType::get(llvm::Type*, unsigned int)", referenced from:
      llvm::CmpInst::makeCmpResultType(llvm::Type*) in fibonacci-1b0cd0.o
  "llvm::ConstantInt::get(llvm::IntegerType*, unsigned long long, bool)", referenced from:
      CreateFibFunction(llvm::Module*, llvm::LLVMContext&) in fibonacci-1b0cd0.o
  "llvm::Instruction::Instruction(llvm::Type*, unsigned int, llvm::Use*, unsigned int, llvm::BasicBlock*)", referenced from:
      llvm::CallInst::CallInst(llvm::Value*, llvm::ArrayRef<llvm::Value*>, llvm::ArrayRef<llvm::OperandBundleDefT<llvm::Value*> >, llvm::Twine const&, llvm::BasicBlock*) in fibonacci-1b0cd0.o
  "llvm::Instruction::~Instruction()", referenced from:
      llvm::CmpInst::~CmpInst() in fibonacci-1b0cd0.o
      llvm::CallInst::CallInst(llvm::Value*, llvm::ArrayRef<llvm::Value*>, llvm::ArrayRef<llvm::OperandBundleDefT<llvm::Value*> >, llvm::Twine const&, llvm::BasicBlock*) in fibonacci-1b0cd0.o
  "llvm::LLVMContext::LLVMContext()", referenced from:
      _main in fibonacci-1b0cd0.o
  "llvm::LLVMContext::~LLVMContext()", referenced from:
      _main in fibonacci-1b0cd0.o
  "llvm::raw_ostream::write(char const*, unsigned long)", referenced from:
      llvm::raw_ostream::operator<<(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in fibonacci-1b0cd0.o
      llvm::raw_ostream::operator<<(llvm::StringRef) in fibonacci-1b0cd0.o
  "llvm::raw_ostream::operator<<(long)", referenced from:
      llvm::raw_ostream::operator<<(int) in fibonacci-1b0cd0.o
  "llvm::verifyModule(llvm::Module const&, llvm::raw_ostream*)", referenced from:
      _main in fibonacci-1b0cd0.o
  "llvm::EngineBuilder::selectTarget()", referenced from:
      llvm::EngineBuilder::create() in fibonacci-1b0cd0.o
  "llvm::EngineBuilder::create(llvm::TargetMachine*)", referenced from:
      llvm::EngineBuilder::create() in fibonacci-1b0cd0.o
  "llvm::EngineBuilder::EngineBuilder(std::__1::unique_ptr<llvm::Module, std::__1::default_delete<llvm::Module> >)", referenced from:
      _main in fibonacci-1b0cd0.o
  "llvm::EngineBuilder::~EngineBuilder()", referenced from:
      _main in fibonacci-1b0cd0.o
  "llvm::BinaryOperator::Create(llvm::Instruction::BinaryOps, llvm::Value*, llvm::Value*, llvm::Twine const&, llvm::BasicBlock*)", referenced from:
      llvm::BinaryOperator::CreateSub(llvm::Value*, llvm::Value*, llvm::Twine const&, llvm::BasicBlock*) in fibonacci-1b0cd0.o
      llvm::BinaryOperator::CreateAdd(llvm::Value*, llvm::Value*, llvm::Twine const&, llvm::BasicBlock*) in fibonacci-1b0cd0.o
  "llvm::llvm_unreachable_internal(char const*, char const*, unsigned int)", referenced from:
      llvm::User::operator delete(void*, unsigned int) in fibonacci-1b0cd0.o
  "llvm::Type::getInt32Ty(llvm::LLVMContext&)", referenced from:
      CreateFibFunction(llvm::Module*, llvm::LLVMContext&) in fibonacci-1b0cd0.o
  "llvm::Type::getInt1Ty(llvm::LLVMContext&)", referenced from:
      llvm::CmpInst::makeCmpResultType(llvm::Type*) in fibonacci-1b0cd0.o
  "llvm::User::operator delete(void*)", referenced from:
      CreateFibFunction(llvm::Module*, llvm::LLVMContext&) in fibonacci-1b0cd0.o
      llvm::ICmpInst::~ICmpInst() in fibonacci-1b0cd0.o
     (maybe you meant: __ZN4llvm4UserdlEPvj)
  "llvm::User::operator new(unsigned long, unsigned int)", referenced from:
      llvm::CmpInst::operator new(unsigned long) in fibonacci-1b0cd0.o
      llvm::BranchInst::Create(llvm::BasicBlock*, llvm::BasicBlock*, llvm::Value*, llvm::BasicBlock*) in fibonacci-1b0cd0.o
      llvm::ReturnInst::Create(llvm::LLVMContext&, llvm::Value*, llvm::BasicBlock*) in fibonacci-1b0cd0.o
      llvm::CallInst::Create(llvm::Value*, llvm::ArrayRef<llvm::Value*>, llvm::Twine const&, llvm::BasicBlock*) in fibonacci-1b0cd0.o
  "llvm::errs()", referenced from:
      _main in fibonacci-1b0cd0.o
  "llvm::outs()", referenced from:
      _main in fibonacci-1b0cd0.o
  "llvm::APInt::initSlowCase(unsigned int, unsigned long long, bool)", referenced from:
      llvm::APInt::APInt(unsigned int, unsigned long long, bool) in fibonacci-1b0cd0.o
  "llvm::Value::setName(llvm::Twine const&)", referenced from:
      CreateFibFunction(llvm::Module*, llvm::LLVMContext&) in fibonacci-1b0cd0.o
  "llvm::Module::getOrInsertFunction(llvm::StringRef, llvm::Type*, ...)", referenced from:
      CreateFibFunction(llvm::Module*, llvm::LLVMContext&) in fibonacci-1b0cd0.o
  "llvm::Module::Module(llvm::StringRef, llvm::LLVMContext&)", referenced from:
      _main in fibonacci-1b0cd0.o
  "llvm::Module::~Module()", referenced from:
      _main in fibonacci-1b0cd0.o
  "llvm::CmpInst::anchor()", referenced from:
      vtable for llvm::ICmpInst in fibonacci-1b0cd0.o
  "llvm::CmpInst::CmpInst(llvm::Type*, llvm::Instruction::OtherOps, unsigned short, llvm::Value*, llvm::Value*, llvm::Twine const&, llvm::BasicBlock*)", referenced from:
      llvm::ICmpInst::ICmpInst(llvm::BasicBlock&, llvm::CmpInst::Predicate, llvm::Value*, llvm::Value*, llvm::Twine const&) in fibonacci-1b0cd0.o
  "llvm::CallInst::init(llvm::FunctionType*, llvm::Value*, llvm::ArrayRef<llvm::Value*>, llvm::ArrayRef<llvm::OperandBundleDefT<llvm::Value*> >, llvm::Twine const&)", referenced from:
      llvm::CallInst::init(llvm::Value*, llvm::ArrayRef<llvm::Value*>, llvm::ArrayRef<llvm::OperandBundleDefT<llvm::Value*> >, llvm::Twine const&) in fibonacci-1b0cd0.o
  "llvm::Type::getScalarType() const", referenced from:
      llvm::Type::isIntOrIntVectorTy() const in fibonacci-1b0cd0.o
      llvm::Type::isPtrOrPtrVectorTy() const in fibonacci-1b0cd0.o
  "llvm::APInt::print(llvm::raw_ostream&, bool) const", referenced from:
      llvm::operator<<(llvm::raw_ostream&, llvm::APInt const&) in fibonacci-1b0cd0.o
  "llvm::Module::print(llvm::raw_ostream&, llvm::AssemblyAnnotationWriter*, bool, bool) const", referenced from:
      llvm::operator<<(llvm::raw_ostream&, llvm::Module const&) in fibonacci-1b0cd0.o
  "llvm::Function::BuildLazyArguments() const", referenced from:
      llvm::Function::CheckLazyArguments() const in fibonacci-1b0cd0.o
  "typeinfo for llvm::CmpInst", referenced from:
      typeinfo for llvm::ICmpInst in fibonacci-1b0cd0.o
  "vtable for llvm::CallInst", referenced from:
      llvm::CallInst::CallInst(llvm::Value*, llvm::ArrayRef<llvm::Value*>, llvm::ArrayRef<llvm::OperandBundleDefT<llvm::Value*> >, llvm::Twine const&, llvm::BasicBlock*) in fibonacci-1b0cd0.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
ld: symbol(s) not found for architecture x86_64
clang-3.8: error: linker command failed with exit code 1 (use -v to see invocation)

ฉันค้นหาต่อไปและพบ คำถามที่คล้ายกัน . อีกช็อต:

เสียงดังกราว++ -g -O3 fibonacci.cpp llvm-config --cxxflags --ldflags --system-libs --libs core -o fib

ข้อผิดพลาดที่สั้นกว่ามาก:

Undefined symbols for architecture x86_64:
  "_LLVMInitializeX86Target", referenced from:
      _main in fibonacci-21f462.o
  "_LLVMInitializeX86TargetInfo", referenced from:
      _main in fibonacci-21f462.o
  "_LLVMInitializeX86TargetMC", referenced from:
      _main in fibonacci-21f462.o
  "_LLVMLinkInInterpreter", referenced from:
      __GLOBAL__sub_I_fibonacci.cpp in fibonacci-21f462.o
  "llvm::EngineBuilder::selectTarget()", referenced from:
      _main in fibonacci-21f462.o
  "llvm::EngineBuilder::create(llvm::TargetMachine*)", referenced from:
      _main in fibonacci-21f462.o
  "llvm::EngineBuilder::EngineBuilder(std::__1::unique_ptr<llvm::Module, std::__1::default_delete<llvm::Module> >)", referenced from:
      _main in fibonacci-21f462.o
  "llvm::EngineBuilder::~EngineBuilder()", referenced from:
      _main in fibonacci-21f462.o
ld: symbol(s) not found for architecture x86_64
clang-3.8: error: linker command failed with exit code 1 (use -v to see invocation)

ไฟล์ปฏิบัติการของ llvm/build/bin ที่สร้างโดย CMake auto-build นั้นดี ซึ่งอาจพิสูจน์ได้ว่า tool chain นั้นใช้งานได้

แต่ฉันยังต้องการที่จะเข้าไปในโค้ดและสังเกต

ใครสามารถช่วยฉันออก?

LLVM version 3.8.0svn
Default target: x86_64-apple-darwin15.0.0
Host CPU: has well

clang version 3.8.0 
Target: x86_64-apple-darwin15.0.0
Thread model: posix

อัปเดต:

ฉันสร้างสิ่งที่ไม่ต้องทำอะไรเลย a-test.cpp:

#include "llvm/IR/Verifier.h"
#include "llvm/ExecutionEngine/GenericValue.h"
#include "llvm/ExecutionEngine/Interpreter.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/Support/TargetSelect.h"
#include "llvm/Support/raw_ostream.h"

int main(int argc, char const *argv[])
{
    printf("hello world\n");
    return 0;
}

และคอมไพล์ได้สำเร็จ:

เสียงดังกราว++ -g -O3 -std=c++11 a-test.cpp llvm-config --cppflags --ldflags --system-libs --libs core executionengine interpreter mc support nativecodegen -o a-test

./a-test

hello world

แต่ไม่ดีนักสำหรับ fibonacci.cpp:

เสียงดังกราว++ -g -O3 -std=c++11 fibonacci.cpp llvm-config --cppflags --ldflags --system-libs --libs core executionengine interpreter mc support nativecodegen -o fib

Undefined symbols for architecture x86_64:
  "typeinfo for llvm::CmpInst", referenced from:
      typeinfo for llvm::ICmpInst in fibonacci-009ddf.o
ld: symbol(s) not found for architecture x86_64
clang-3.8: error: linker command failed with exit code 1 (use -v to see invocation)

person Rahn    schedule 12.11.2015    source แหล่งที่มา
comment
.. ฉันตอบคำถามนี้ในคำถามอื่นที่คุณถาม ซึ่งโดยพื้นฐานแล้วจะเหมือนกัน แต่คุณลบคำถาม (และคำตอบของฉันค่อนข้างหยาบคาย!) -- เกิดอะไรขึ้นกับการใช้เป้าหมายนินจาในตัว ninja Fibonnaci หากคุณต้องการดูบรรทัดคำสั่งที่แน่นอน ให้ดูที่ build.log จากระบบ build   -  person dune.rocks    schedule 12.11.2015
comment
@ dune.rocks ฉันขอโทษ คำตอบของคุณเป็นแรงบันดาลใจ แต่ฉันได้คำตอบที่สมบูรณ์จากคำถามอื่น ดังนั้นฉันควรยอมรับคำตอบของคุณก่อนในครั้งต่อไปที่เกิดเหตุการณ์เช่นนี้?   -  person Rahn    schedule 13.11.2015
comment
@ dune.rocks คุณช่วยเขียนคำตอบพร้อมคำแนะนำได้ไหม ฉันค้นหา build.log และไม่มีอะไรอยู่ในโฟลเดอร์ และค้นหา log file เพียงเพื่อค้นหา CMakeError.log, CMakeOutput.log และ CMakeOutput.log   -  person Rahn    schedule 13.11.2015


คำตอบ (1)


หากคุณดูใน CMakeFile ที่สร้าง Fibonacci คุณจะเห็นว่าต้องใช้มากกว่าไลบรารี Core

ต้องใช้ Core, ExecutionEngine, Interpreter, MC, Support, nativecodege บรรทัด --libs ที่ถูกต้องจะเป็น --libs core executionengine interpreter mc support nativecodegen

ไฟล์ที่คุณกำลังมองหาคือ build.ninja หากคุณค้นหา Fibonacci คุณจะพบข้อมูลทั้งหมดที่คุณต้องการ

แก้ไข: เนื่องจาก OP มีปัญหาที่นี่ ฉันจึงได้รวมบรรทัดคำสั่งที่แก้ไขไว้ด้วย

clang++ -g -O3 -std=c++11 -fno-exceptions -fno-rtti fibonacci.cpp `llvm-config --cppflags --ldflags --system-libs --libs core executionengine interpreter mc support nativecodegen` -o fib

โดยทั่วไปแล้ว การใช้ llvm-config --ldflags --libs จะง่ายกว่าแทนที่จะกังวลว่าคุณต้องการชุดย่อยใดเช่นกัน แต่ก็ไม่เป็นไร

นี่ไม่ใช่วิธีที่ถูกต้องอยู่แล้ว ใช้ระบบบิลด์!

person dune.rocks    schedule 13.11.2015
comment
ใช้งานไม่ได้: 0. ไม่รู้จักการตั้งค่าสถานะไดรเวอร์ (อธิบายไว้ในการอัปเดต) 1. ไม่พบไฟล์ที่มีส่วน ninja - person Rahn; 13.11.2015
comment
คุณลืมเครื่องหมายคำพูดด้านหลังรอบ ๆ llvm-config และในความเป็นจริงแล้วกำลังส่งตัวเลือกไปยังคอมไพเลอร์! - person dune.rocks; 13.11.2015
comment
ฉันเห็น hello world! ยังคงติดอยู่ที่ fibonacci.cpp - person Rahn; 13.11.2015
comment
คุณต้องผ่าน -fno-rtti เพื่อให้มันใช้งานได้ คุณจะต้องการ -fno-exceptions ตอนนี้เมื่อฉันคิดถึงมันแล้ว - person dune.rocks; 13.11.2015
comment
บิงโกที่ยากลำบาก -fno-exceptions ไม่จำเป็นในกรณีนี้ - person Rahn; 13.11.2015
comment
อาจจะไม่ใช่ ฉันแค่แนะนำ -fno-exceptions เพราะนั่นคือสิ่งที่ระบบบิลด์ LLVM ใช้ (และฉันคิดว่าพวกเขามีเหตุผลที่ดี แต่ก็อาจเป็นเรื่องในอดีตได้เช่นกัน) - person dune.rocks; 13.11.2015
comment
ขอบคุณสำหรับความมีน้ำใจของคุณ คุณช่วยบอกฉันเพิ่มเติมเกี่ยวกับไฟล์บิลด์ได้ไหม ฉันไม่พบสิ่งใดที่เกี่ยวข้องกับ ninja - person Rahn; 13.11.2015
comment
ความคิดเห็นยาวเกินไปแล้ว Ninja เป็นระบบบิลด์เหมือนกับ Make คำถามนี้ได้รับการแก้ไขแล้ว - person dune.rocks; 13.11.2015