0

I'm trying to build my llvm-project, but ld-linker returns "undefined function" to every function on llvm namespace with cmake.

I tried to solve this by putting some cmake code like following

set(CMAKE_EXE_LINKER_FLAGS "-I/usr/local/include -std=c++14   -fno-exceptions -fno-rtti -D_GNU_SOURCE -D_DEBUG -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -L/usr/local/lib")
set(Cmake_CXX_Flags "-lLLVMXRay -lLLVMWindowsManifest -lLLVMTableGen -lLLVMSymbolize -lLLVMDebugInfoPDB -lLLVMOrcJIT -lLLVMJITLink -lLLVMObjectYAML -lLLVMMCA -lLLVMLTO -lLLVMPasses -lLLVMObjCARCOpts -lLLVMLineEditor -lLLVMLibDriver -lLLVMInterpreter -lLLVMFuzzMutate -lLLVMMCJIT -lLLVMExecutionEngine -lLLVMRuntimeDyld -lLLVMDlltoolDriver -lLLVMOption -lLLVMDebugInfoGSYM -lLLVMCoverage -lLLVMCoroutines -lLLVMXCoreDisassembler -lLLVMXCoreCodeGen -lLLVMXCoreDesc -lLLVMXCoreInfo -lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMX86Desc -lLLVMX86Utils -lLLVMX86Info -lLLVMWebAssemblyDisassembler -lLLVMWebAssemblyCodeGen -lLLVMWebAssemblyDesc -lLLVMWebAssemblyAsmParser -lLLVMWebAssemblyInfo -lLLVMSystemZDisassembler -lLLVMSystemZCodeGen -lLLVMSystemZAsmParser -lLLVMSystemZDesc -lLLVMSystemZInfo -lLLVMSparcDisassembler -lLLVMSparcCodeGen -lLLVMSparcAsmParser -lLLVMSparcDesc -lLLVMSparcInfo -lLLVMRISCVDisassembler -lLLVMRISCVCodeGen -lLLVMRISCVAsmParser -lLLVMRISCVDesc -lLLVMRISCVUtils -lLLVMRISCVInfo -lLLVMPowerPCDisassembler -lLLVMPowerPCCodeGen -lLLVMPowerPCAsmParser -lLLVMPowerPCDesc -lLLVMPowerPCInfo -lLLVMNVPTXCodeGen -lLLVMNVPTXDesc -lLLVMNVPTXInfo -lLLVMMSP430Disassembler -lLLVMMSP430CodeGen -lLLVMMSP430AsmParser -lLLVMMSP430Desc -lLLVMMSP430Info -lLLVMMipsDisassembler -lLLVMMipsCodeGen -lLLVMMipsAsmParser -lLLVMMipsDesc -lLLVMMipsInfo -lLLVMLanaiDisassembler -lLLVMLanaiCodeGen -lLLVMLanaiAsmParser -lLLVMLanaiDesc -lLLVMLanaiInfo -lLLVMHexagonDisassembler -lLLVMHexagonCodeGen -lLLVMHexagonAsmParser -lLLVMHexagonDesc -lLLVMHexagonInfo -lLLVMBPFDisassembler -lLLVMBPFCodeGen -lLLVMBPFAsmParser -lLLVMBPFDesc -lLLVMBPFInfo -lLLVMARMDisassembler -lLLVMARMCodeGen -lLLVMARMAsmParser -lLLVMARMDesc -lLLVMARMUtils -lLLVMARMInfo -lLLVMAMDGPUDisassembler -lLLVMAMDGPUCodeGen -lLLVMMIRParser -lLLVMipo -lLLVMInstrumentation -lLLVMVectorize -lLLVMLinker -lLLVMIRReader -lLLVMAsmParser -lLLVMAMDGPUAsmParser -lLLVMAMDGPUDesc -lLLVMAMDGPUUtils -lLLVMAMDGPUInfo -lLLVMAArch64Disassembler -lLLVMMCDisassembler -lLLVMAArch64CodeGen -lLLVMGlobalISel -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMDebugInfoDWARF -lLLVMCodeGen -lLLVMTarget -lLLVMScalarOpts -lLLVMInstCombine -lLLVMAggressiveInstCombine -lLLVMTransformUtils -lLLVMBitWriter -lLLVMAnalysis -lLLVMProfileData -lLLVMObject -lLLVMTextAPI -lLLVMBitReader -lLLVMBitstreamReader -lLLVMCore -lLLVMRemarks -lLLVMAArch64AsmParser -lLLVMMCParser -lLLVMAArch64Desc -lLLVMMC -lLLVMDebugInfoCodeView -lLLVMDebugInfoMSF -lLLVMBinaryFormat -lLLVMAArch64Utils -lLLVMAArch64Info -lLLVMSupport -lLLVMDemangle -lrt -ldl -lpthread -lm")

these are return value of "llvm-config --ldflags --cxxflags" and "llvm-config --libs --system-libs".

The command-line error messages.

/usr/bin/ld: CMakeFiles/giuniu.dir/source/ast/AST_code_gen.cpp.o: in function `INT_EXPR_AST::generate()':
/home/montyaxn/work/zanka/source/ast/AST_code_gen.cpp:38: undefined reference to `llvm::APInt::APInt(unsigned int, llvm::StringRef, unsigned char)'
/usr/bin/ld: /home/montyaxn/work/zanka/source/ast/AST_code_gen.cpp:38: undefined reference to `llvm::ConstantInt::get(llvm::LLVMContext&, llvm::APInt const&)'
/usr/bin/ld: CMakeFiles/giuniu.dir/source/ast/AST_code_gen.cpp.o: in function `__cxx_global_var_init':
/home/montyaxn/work/zanka/source/ast/AST_code_gen.cpp:22: undefined reference to `llvm::LLVMContext::LLVMContext()'
/usr/bin/ld: /home/montyaxn/work/zanka/source/ast/AST_code_gen.cpp:22: undefined reference to `llvm::LLVMContext::~LLVMContext()'
/usr/bin/ld: CMakeFiles/giuniu.dir/source/ast/AST_code_gen.cpp.o: in function `llvm::MetadataTracking::untrack(llvm::Metadata*&)':
/usr/local/include/llvm/IR/Metadata.h:245: undefined reference to `llvm::MetadataTracking::untrack(void*, llvm::Metadata&)'
/usr/bin/ld: CMakeFiles/giuniu.dir/source/ast/AST_code_gen.cpp.o: in function `std::default_delete<llvm::Module>::operator()(llvm::Module*) const':
/usr/lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/unique_ptr.h:81: undefined reference to `llvm::Module::~Module()'
/usr/bin/ld: CMakeFiles/giuniu.dir/source/ast/AST_code_gen.cpp.o: in function `llvm::ConstantFolder::CreateAdd(llvm::Constant*, llvm::Constant*, bool, bool) const':
/usr/local/include/llvm/IR/ConstantFolder.h:37: undefined reference to `llvm::ConstantExpr::getAdd(llvm::Constant*, llvm::Constant*, bool, bool)'
/usr/bin/ld: CMakeFiles/giuniu.dir/source/ast/AST_code_gen.cpp.o: in function `llvm::IRBuilder<llvm::ConstantFolder, llvm::IRBuilderDefaultInserter>::CreateInsertNUWNSWBinOp(llvm::Instruction::BinaryOps, llvm::Value*, llvm::Value*, llvm::Twine const&, bool, bool)':
/usr/local/include/llvm/IR/IRBuilder.h:1062: undefined reference to `llvm::BinaryOperator::Create(llvm::Instruction::BinaryOps, llvm::Value*, llvm::Value*, llvm::Twine const&, llvm::Instruction*)'
/usr/bin/ld: /usr/local/include/llvm/IR/IRBuilder.h:1063: undefined reference to `llvm::Instruction::setHasNoUnsignedWrap(bool)'
/usr/bin/ld: /usr/local/include/llvm/IR/IRBuilder.h:1064: undefined reference to `llvm::Instruction::setHasNoSignedWrap(bool)'
/usr/bin/ld: CMakeFiles/giuniu.dir/source/ast/AST_code_gen.cpp.o: in function `llvm::IRBuilderDefaultInserter::InsertHelper(llvm::Instruction*, llvm::Twine const&, llvm::BasicBlock*, llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Instruction, true, false, void>, false, false>) const':
/usr/local/include/llvm/IR/IRBuilder.h:66: undefined reference to `llvm::Value::setName(llvm::Twine const&)'
/usr/bin/ld: CMakeFiles/giuniu.dir/source/ast/AST_code_gen.cpp.o: in function `llvm::iplist_impl<llvm::simple_ilist<llvm::Instruction>, llvm::SymbolTableListTraits<llvm::Instruction> >::insert(llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Instruction, true, false, void>, false, false>, llvm::Instruction*)':
/usr/local/include/llvm/ADT/ilist.h:227: undefined reference to `llvm::SymbolTableListTraits<llvm::Instruction>::addNodeToList(llvm::Instruction*)'
/usr/bin/ld: CMakeFiles/giuniu.dir/source/ast/AST_code_gen.cpp.o: in function `llvm::MetadataTracking::retrack(llvm::Metadata*&, llvm::Metadata*&)':
/usr/local/include/llvm/IR/Metadata.h:257: undefined reference to `llvm::MetadataTracking::retrack(void*, llvm::Metadata&, void*)'
/usr/bin/ld: CMakeFiles/giuniu.dir/source/ast/AST_code_gen.cpp.o: in function `llvm::MetadataTracking::track(llvm::Metadata*&)':
/usr/local/include/llvm/IR/Metadata.h:221: undefined reference to `llvm::MetadataTracking::track(void*, llvm::Metadata&, llvm::PointerUnion<llvm::MetadataAsValue*, llvm::Metadata*>)'
/usr/bin/ld: CMakeFiles/giuniu.dir/source/ast/AST_code_gen.cpp.o: in function `llvm::ConstantFolder::CreateSub(llvm::Constant*, llvm::Constant*, bool, bool) const':
/usr/local/include/llvm/IR/ConstantFolder.h:46: undefined reference to `llvm::ConstantExpr::getSub(llvm::Constant*, llvm::Constant*, bool, bool)'
/usr/bin/ld: CMakeFiles/giuniu.dir/source/ast/AST_code_gen.cpp.o: in function `llvm::ConstantFolder::CreateMul(llvm::Constant*, llvm::Constant*, bool, bool) const':
/usr/local/include/llvm/IR/ConstantFolder.h:55: undefined reference to `llvm::ConstantExpr::getMul(llvm::Constant*, llvm::Constant*, bool, bool)'
clang-10: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: *** [CMakeFiles/giuniu.dir/build.make:174: giuniu] Error 1
make[2]: *** [CMakeFiles/Makefile2:73: CMakeFiles/giuniu.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:85: CMakeFiles/giuniu.dir/rule] Error 2
make: *** [Makefile:118: giuniu] Error 2
πάντα ῥεῖ
  • 1
  • 13
  • 116
  • 190
  • Presumably because you haven't installed the llvm libraries in the location that the linker is looking for them. Have you looked? If so then mention it in the question. – john Aug 25 '19 at 08:53
  • `/usr/local/lib` seems to be the only location that you are looking for any libraries. Are the llvm libraries installed there? – john Aug 25 '19 at 08:55
  • 1
    Variable `CMAKE_CXX_FLAGS` (which you have typed wrongly: in CMake variables' names are **case-sensitive**) is a **wrong place** for `-l` flags. Use `target_link_libraries` or `link_libraries` instead. – Tsyvarev Aug 25 '19 at 10:15
  • Thank you for answering. Yes, I have installed llvm libraries and a lot of llvm .a files were in the /usr/local/lib. @john – montyaxn Aug 27 '19 at 08:37
  • Thank you. I changed CMAKE_CXX_FLAGS into target_link_libraries but ld returns error still. @Tsyvarev – montyaxn Aug 27 '19 at 08:42
  • @montyaxn Mixing 32 bit and 64 bit can cause this kind of problem. Is it possible that you have a 32 bit program but 64 bit libraries (or vice versa). – john Aug 27 '19 at 08:49
  • @john I have x86-64 ubuntu and llvm support amd64 linux. – montyaxn Aug 27 '19 at 11:28
  • @montyaxn Well all I can suggest is that you analyse the output you are getting and work out the problem. It helps to eliminate as many variables as possible. The obvious place to start is CMake. Can you build a simple app and link it with LLVM without using CMake? If so then it's your use of CMake that is at fault. Just strip things down until it's as simple as possible. – john Aug 27 '19 at 14:50
  • @john finally "target_link_libraries" worked!! All I need to do was to shift "-l***" options from target_link_options to it... Thank you for being so thoughtful! – montyaxn Aug 28 '19 at 13:32

0 Answers0