Cannot build on Mac

I am trying to build TVM on a Mac running 10.15.6 following this: https://tvm.apache.org/docs/install/from_source.html

When building I run into the following error

Consolidate compiler generated dependencies of target tvm_objs
[100%] Built target tvm_objs
[100%] Linking CXX shared library libtvm.dylib
Undefined symbols for architecture x86_64:
  "llvm::parseIRFile(llvm::StringRef, llvm::SMDiagnostic&, llvm::LLVMContext&, llvm::function_ref<llvm::Optional<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > (llvm::StringRef)>)", referenced from:
      tvm::codegen::BuildAMDGPU(tvm::IRModule, tvm::Target)  in codegen_amdgpu.cc.o
      tvm::codegen::CodeGenLLVM::HandleImport(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) in codegen_llvm.cc.o
      tvm::codegen::BuildNVPTX(tvm::IRModule, tvm::Target)  in codegen_nvptx.cc.o
      std::_Function_handler<void (tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*), tvm::runtime::TypedPackedFunc<tvm::runtime::Module (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)>::AssignTypedLambda<tvm::codegen::{lambda(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)#10}>(tvm::codegen::{lambda(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)#10}, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)::{lambda(tvm::runtime::TVMArgs const&, tvm::runtime::TVMRetValue*)#1}>::_M_invoke(std::_Any_data const&, tvm::runtime::TVMArgs&&, tvm::runtime::TVMRetValue*&&) in llvm_module.cc.o
  "llvm::EngineBuilder::EngineBuilder(std::unique_ptr<llvm::Module, std::default_delete<llvm::Module> >)", referenced from:
      tvm::codegen::LLVMModuleNode::LazyInitJIT()     in llvm_module.cc.o
  "llvm::TargetRegistry::lookupTarget(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)", referenced from:
      tvm::codegen::GetLLVMTargetMachine(tvm::Target const&, bool) in llvm_common.cc.o
  "llvm::raw_fd_ostream::raw_fd_ostream(llvm::StringRef, std::error_code&, llvm::sys::fs::OpenFlags)", referenced from:
      tvm::codegen::LLVMModuleNode::SaveToFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) in llvm_module.cc.o
  "llvm::WriteBitcodeToFile(llvm::Module const&, llvm::raw_ostream&, bool, llvm::ModuleSummaryIndex const*, bool, std::array<unsigned int, 5ul>*)", referenced from:
      tvm::codegen::BuildHexagon(tvm::IRModule, tvm::Target)::{lambda(llvm::Module const&, tvm::codegen::BuildHexagon(tvm::IRModule, tvm::Target)::CodeGenFileType)#2}::operator()(llvm::Module const&, tvm::codegen::BuildHexagon(tvm::IRModule, tvm::Target)::CodeGenFileType) const [clone .isra.984] in codegen_hexagon.cc.o
      tvm::codegen::LLVMModuleNode::SaveToFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) in llvm_module.cc.o
  "llvm::sys::getDefaultTargetTriple[abi:cxx11]()", referenced from:
      tvm::codegen::ParseLLVMTargetOptions(tvm::Target const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, llvm::TargetOptions*) in llvm_common.cc.o
      tvm::codegen::GetLLVMTargetMachine(tvm::Target const&, bool) in llvm_common.cc.o
  "llvm::Linker::linkModules(llvm::Module&, std::unique_ptr<llvm::Module, std::default_delete<llvm::Module> >, unsigned int, std::function<void (llvm::Module&, llvm::StringSet<llvm::MallocAllocator> const&)>)", referenced from:
      tvm::codegen::CodeGenLLVM::Finish()    in codegen_llvm.cc.o
  "llvm::parseIR(llvm::MemoryBufferRef, llvm::SMDiagnostic&, llvm::LLVMContext&, llvm::function_ref<llvm::Optional<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > (llvm::StringRef)>)", referenced from:
      tvm::codegen::CodeGenLLVM::HandleImport(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) in codegen_llvm.cc.o
  "llvm::Intrinsic::getName[abi:cxx11](unsigned int, llvm::ArrayRef<llvm::Type*>)", referenced from:
      tvm::codegen::CodeGenLLVM::CreateIntrinsic(tvm::tir::CallNode const*) in codegen_llvm.cc.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
make[2]: *** [libtvm.dylib] Error 1
make[1]: *** [CMakeFiles/tvm.dir/all] Error 2
make: *** [all] Error 2

I pay attention to this problem, and I added the flag correctly by adding the following lines to the config.cmake, But the above error still occurs.

add_compile_options("-lc++abi")
link_libraries("-lc++abi")

looks like some llvm symbols were missing, can you check your llvm version?

llvm-config --version : 12.0.1

I install LLVM by brew

brew install llvm

cmake info :

-- Not found - LLVM_LIBS
-- Fall back to using llvm-config
-- Use llvm-config=/usr/local/opt/llvm/bin/llvm-config
-- Found LLVM_INCLUDE_DIRS=/usr/local/Cellar/llvm/12.0.1/include
-- Found LLVM_DEFINITIONS=-D__STDC_CONSTANT_MACROS;-D__STDC_FORMAT_MACROS;-D__STDC_LIMIT_MACROS
-- Found LLVM_LIBS=/usr/local/Cellar/llvm/12.0.1/lib/libLLVM-12.dylib
-- Found TVM_LLVM_VERSION=120
-- Build with LLVM 12.0.1
-- Set TVM_LLVM_VERSION=120

There are some C++ ABI issues, you can try building llvm from source or using a different compiler version. (Adding -lc++abi is not sufficient as llvm was pre-built in another ABI)

which clang version is installed in /usr/local/opt/llvm/bin/?

what /usr/local/opt/llvm/bin/clang --version and /usr/local/opt/llvm/bin/clang++ show?

another clang of different version can be installed in /usr/bin

You can try to point which clang to use manually using below command line to build TVM

cmake -DCMAKE_C_COMPILER=/usr/local/opt/llvm/bin/clang -DCMAKE_CXX_COMPILER=/usr/local/opt/llvm/bin/clang++ -DCMAKE_BUILD_TYPE=Release -DUSE_LLVM=/usr/local/opt/llvm/bin/llvm-config ..

@elvin-n llvm-dis --version

Homebrew LLVM version 12.0.1
  Optimized build.
  Default target: x86_64-apple-darwin19.6.0
  Host CPU: skylake

clang --version

Homebrew clang version 12.0.1
Target: x86_64-apple-darwin19.6.0
Thread model: posix
InstalledDir: /usr/local/opt/llvm/bin

clang++

clang-12: error: no input files

I lowered the LLVM version to 9.0 and the same error was reported

 ...
  "__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev", referenced from:
      __ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE in libLLVMNVPTXCodeGen.a(NVPTXAsmPrinter.cpp.o)
      __ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE in libLLVMipo.a(Inliner.cpp.o)
      __ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE in libLLVMHexagonDesc.a(HexagonAsmBackend.cpp.o)
      __ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE in libLLVMInstrumentation.a(InstrOrderFile.cpp.o)
      __ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE in libLLVMNVPTXCodeGen.a(NVPTXISelLowering.cpp.o)
      __ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE in libLLVMTransformUtils.a(ImportedFunctionsInliningStatistics.cpp.o)
  "__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev", referenced from:
      __ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE in libLLVMNVPTXCodeGen.a(NVPTXAsmPrinter.cpp.o)
      __ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE in libLLVMipo.a(Inliner.cpp.o)
      __ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE in libLLVMHexagonDesc.a(HexagonAsmBackend.cpp.o)
      __ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE in libLLVMInstrumentation.a(InstrOrderFile.cpp.o)
      __ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE in libLLVMNVPTXCodeGen.a(NVPTXISelLowering.cpp.o)
      __ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE in libLLVMTransformUtils.a(ImportedFunctionsInliningStatistics.cpp.o)
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
make[2]: *** [libtvm.dylib] Error 1
make[1]: *** [CMakeFiles/tvm.dir/all] Error 2
make: *** [all] Error 2

llvm-dis --version

LLVM (http://llvm.org/):
  LLVM version 9.0.1
  Optimized build.
  Default target: x86_64-apple-darwin19.6.0
  Host CPU: skylake

clang --version

clang version 9.0.1
Target: x86_64-apple-darwin19.6.0
Thread model: posix
InstalledDir: /usr/local/opt/llvm@9/bin

clang++

clang-9: error: no input files

I tried a lot of LLVM versions but they didn’t work,like 9.0 11.0 12.0 …

Maybe I need to compile from source