How to solve Undefined symbols for architecture x86_64 error when using C++ API `llvm::InitializeAllAsmParsers()` in LLVM?

Viewed 378

I'm trying to implement my toy programming language with LLVM as backend.

I try to generate .o files, using these APIs to initialize:

llvm::InitializeAllTargetInfos();
llvm::InitializeAllTargets();
llvm::InitializeAllTargetMCs();
llvm::InitializeAllAsmParsers();
llvm::InitializeAllAsmPrinters();

Here's part of my CMakeLists.txt:

find_package(LLVM REQUIRED CONFIG)
llvm_map_components_to_libnames(llvm_libraries analysis support core object irreader executionengine scalaropts instcombine orcjit runtimedyld)

add_executable(shepherdc ${SOURCE_FILE})
target_include_directories(shepherdc ${LLVM_INCLUDE_DIRS})
target_link_libraries(shepherdc ${llvm_libraries})

It gives me error message:

Undefined symbols for architecture x86_64:
  "_LLVMInitializeAArch64AsmParser", referenced from:
      llvm::InitializeAllAsmParsers() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeAArch64AsmPrinter", referenced from:
      llvm::InitializeAllAsmPrinters() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeAArch64Target", referenced from:
      llvm::InitializeAllTargets() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeAArch64TargetInfo", referenced from:
      llvm::InitializeAllTargetInfos() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeAArch64TargetMC", referenced from:
      llvm::InitializeAllTargetMCs() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeAMDGPUAsmParser", referenced from:
      llvm::InitializeAllAsmParsers() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeAMDGPUAsmPrinter", referenced from:
      llvm::InitializeAllAsmPrinters() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeAMDGPUTarget", referenced from:
      llvm::InitializeAllTargets() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeAMDGPUTargetInfo", referenced from:
      llvm::InitializeAllTargetInfos() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeAMDGPUTargetMC", referenced from:
      llvm::InitializeAllTargetMCs() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeARMAsmParser", referenced from:
      llvm::InitializeAllAsmParsers() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeARMAsmPrinter", referenced from:
      llvm::InitializeAllAsmPrinters() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeARMTarget", referenced from:
      llvm::InitializeAllTargets() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeARMTargetInfo", referenced from:
      llvm::InitializeAllTargetInfos() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeARMTargetMC", referenced from:
      llvm::InitializeAllTargetMCs() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeBPFAsmParser", referenced from:
      llvm::InitializeAllAsmParsers() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeBPFAsmPrinter", referenced from:
      llvm::InitializeAllAsmPrinters() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeBPFTarget", referenced from:
      llvm::InitializeAllTargets() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeBPFTargetInfo", referenced from:
      llvm::InitializeAllTargetInfos() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeBPFTargetMC", referenced from:
      llvm::InitializeAllTargetMCs() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeHexagonAsmParser", referenced from:
      llvm::InitializeAllAsmParsers() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeHexagonAsmPrinter", referenced from:
      llvm::InitializeAllAsmPrinters() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeHexagonTarget", referenced from:
      llvm::InitializeAllTargets() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeHexagonTargetInfo", referenced from:
      llvm::InitializeAllTargetInfos() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeHexagonTargetMC", referenced from:
      llvm::InitializeAllTargetMCs() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeLanaiAsmParser", referenced from:
      llvm::InitializeAllAsmParsers() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeLanaiAsmPrinter", referenced from:
      llvm::InitializeAllAsmPrinters() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeLanaiTarget", referenced from:
      llvm::InitializeAllTargets() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeLanaiTargetInfo", referenced from:
      llvm::InitializeAllTargetInfos() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeLanaiTargetMC", referenced from:
      llvm::InitializeAllTargetMCs() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeMSP430AsmParser", referenced from:
      llvm::InitializeAllAsmParsers() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeMSP430AsmPrinter", referenced from:
      llvm::InitializeAllAsmPrinters() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeMSP430Target", referenced from:
      llvm::InitializeAllTargets() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeMSP430TargetInfo", referenced from:
      llvm::InitializeAllTargetInfos() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeMSP430TargetMC", referenced from:
      llvm::InitializeAllTargetMCs() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeMipsAsmParser", referenced from:
      llvm::InitializeAllAsmParsers() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeMipsAsmPrinter", referenced from:
      llvm::InitializeAllAsmPrinters() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeMipsTarget", referenced from:
      llvm::InitializeAllTargets() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeMipsTargetInfo", referenced from:
      llvm::InitializeAllTargetInfos() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeMipsTargetMC", referenced from:
      llvm::InitializeAllTargetMCs() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeNVPTXAsmPrinter", referenced from:
      llvm::InitializeAllAsmPrinters() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeNVPTXTarget", referenced from:
      llvm::InitializeAllTargets() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeNVPTXTargetInfo", referenced from:
      llvm::InitializeAllTargetInfos() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeNVPTXTargetMC", referenced from:
      llvm::InitializeAllTargetMCs() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializePowerPCAsmParser", referenced from:
      llvm::InitializeAllAsmParsers() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializePowerPCAsmPrinter", referenced from:
      llvm::InitializeAllAsmPrinters() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializePowerPCTarget", referenced from:
      llvm::InitializeAllTargets() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializePowerPCTargetInfo", referenced from:
      llvm::InitializeAllTargetInfos() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializePowerPCTargetMC", referenced from:
      llvm::InitializeAllTargetMCs() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeRISCVAsmParser", referenced from:
      llvm::InitializeAllAsmParsers() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeRISCVAsmPrinter", referenced from:
      llvm::InitializeAllAsmPrinters() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeRISCVTarget", referenced from:
      llvm::InitializeAllTargets() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeRISCVTargetInfo", referenced from:
      llvm::InitializeAllTargetInfos() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeRISCVTargetMC", referenced from:
      llvm::InitializeAllTargetMCs() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeSparcAsmParser", referenced from:
      llvm::InitializeAllAsmParsers() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeSparcAsmPrinter", referenced from:
      llvm::InitializeAllAsmPrinters() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeSparcTarget", referenced from:
      llvm::InitializeAllTargets() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeSparcTargetInfo", referenced from:
      llvm::InitializeAllTargetInfos() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeSparcTargetMC", referenced from:
      llvm::InitializeAllTargetMCs() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeSystemZAsmParser", referenced from:
      llvm::InitializeAllAsmParsers() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeSystemZAsmPrinter", referenced from:
      llvm::InitializeAllAsmPrinters() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeSystemZTarget", referenced from:
      llvm::InitializeAllTargets() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeSystemZTargetInfo", referenced from:
      llvm::InitializeAllTargetInfos() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeSystemZTargetMC", referenced from:
      llvm::InitializeAllTargetMCs() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeWebAssemblyAsmParser", referenced from:
      llvm::InitializeAllAsmParsers() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeWebAssemblyAsmPrinter", referenced from:
      llvm::InitializeAllAsmPrinters() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeWebAssemblyTarget", referenced from:
      llvm::InitializeAllTargets() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeWebAssemblyTargetInfo", referenced from:
      llvm::InitializeAllTargetInfos() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeWebAssemblyTargetMC", referenced from:
      llvm::InitializeAllTargetMCs() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeX86AsmParser", referenced from:
      llvm::InitializeAllAsmParsers() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeX86AsmPrinter", referenced from:
      llvm::InitializeAllAsmPrinters() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeX86Target", referenced from:
      llvm::InitializeAllTargets() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeX86TargetInfo", referenced from:
      llvm::InitializeAllTargetInfos() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeX86TargetMC", referenced from:
      llvm::InitializeAllTargetMCs() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeXCoreAsmPrinter", referenced from:
      llvm::InitializeAllAsmPrinters() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeXCoreTarget", referenced from:
      llvm::InitializeAllTargets() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeXCoreTargetInfo", referenced from:
      llvm::InitializeAllTargetInfos() in libshepherd.a(IrWriter.cpp.o)
  "_LLVMInitializeXCoreTargetMC", referenced from:
      llvm::InitializeAllTargetMCs() in libshepherd.a(IrWriter.cpp.o)
ld: symbol(s) not found for architecture x86_64
clang-10: error: linker command failed with exit code 1 (use -v to see invocation)

What extra LLVM library should I link to ?

1 Answers

Add to your CMakeLists.txt following code for generating LLVMX86CodeGen; LLVMARMCodeGen... from ${LLVM_TARGETS_TO_BUILD}:

foreach(target ${LLVM_TARGETS_TO_BUILD})
  list(APPEND targets "LLVM${target}CodeGen")
endforeach()

target_link_libraries(shepherdc ${llvm_libraries} ${targets})
Related