c-在项目中包含LLVM会导致错误(Cmake)



我对CMAKE非常陌生。我和我的朋友想制作一种编程语言。基本的Lexer和Parser工作得很好。现在,我们希望在项目中包含LLVM来编译该语言。但是我得到了很多错误,我现在真的不知道什么和如何包括LLVM。

这是我的CMAKE文件:

cmake_minimum_required(VERSION 3.22)
project(absturz)
set(CMAKE_CXX_STANDARD 14)
set(LLVM_PATH /usr/local/Cellar/llvm@13/13.0.1)
link_directories(${LLVM_PATH}/bin)
include_directories(${LLVM_PATH}/include)
add_definitions(
-D__STDC_LIMIT_MACROS
-D__STDC_CONSTANT_MACROS
)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti -std=c++11")
add_executable(absturz main.cpp lang/Lexer.h lang/Token.h lang/src/Token.cpp lang/src/Lexer.cpp lang/Compiler.h lang/src/Compiler.cpp)
target_link_libraries(absturz
/usr/local/Cellar/llvm@13/13.0.1/lib/libLLVMCore.a
/usr/local/Cellar/llvm@13/13.0.1/lib/libLLVMSupport.a
)

当我编译项目时,我得到:

[1/1] Linking CXX executable absturz
FAILED: absturz 
: && /Library/Developer/CommandLineTools/usr/bin/c++ -fno-rtti -std=c++11 -g -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.3.sdk -Wl,-search_paths_first -Wl,-headerpad_max_install_names  CMakeFiles/absturz.dir/main.cpp.o CMakeFiles/absturz.dir/lang/src/Token.cpp.o CMakeFiles/absturz.dir/lang/src/Lexer.cpp.o CMakeFiles/absturz.dir/lang/src/Compiler.cpp.o -o absturz -L/usr/local/Cellar/llvm@13/13.0.1/bin -Wl,-rpath,/usr/local/Cellar/llvm@13/13.0.1/bin  /usr/local/Cellar/llvm@13/13.0.1/lib/libLLVMCore.a  /usr/local/Cellar/llvm@13/13.0.1/lib/libLLVMSupport.a  /usr/local/Cellar/llvm@13/13.0.1/lib/libLLVMDemangle.a && :
Undefined symbols for architecture x86_64:
"llvm::EngineBuilder::selectTarget()", referenced from:
llvm::EngineBuilder::create() in Compiler.cpp.o
"llvm::EngineBuilder::create(llvm::TargetMachine*)", referenced from:
llvm::EngineBuilder::create() in Compiler.cpp.o
"llvm::EngineBuilder::EngineBuilder(std::__1::unique_ptr<llvm::Module, std::__1::default_delete<llvm::Module> >)", referenced from:
Compiler::compile() in Compiler.cpp.o
"llvm::EngineBuilder::~EngineBuilder()", referenced from:
Compiler::compile() in Compiler.cpp.o
"llvm::dwarf::MacinfoString(unsigned int)", referenced from:
WriteMDNodeBodyInternal(llvm::raw_ostream&, llvm::MDNode const*, (anonymous namespace)::TypePrinting*, llvm::SlotTracker*, llvm::Module const*) in libLLVMCore.a(AsmWriter.cpp.o)
"llvm::dwarf::LanguageString(unsigned int)", referenced from:
WriteMDNodeBodyInternal(llvm::raw_ostream&, llvm::MDNode const*, (anonymous namespace)::TypePrinting*, llvm::SlotTracker*, llvm::Module const*) in libLLVMCore.a(AsmWriter.cpp.o)
"llvm::dwarf::ConventionString(unsigned int)", referenced from:
WriteMDNodeBodyInternal(llvm::raw_ostream&, llvm::MDNode const*, (anonymous namespace)::TypePrinting*, llvm::SlotTracker*, llvm::Module const*) in libLLVMCore.a(AsmWriter.cpp.o)
"llvm::dwarf::AttributeEncodingString(unsigned int)", referenced from:
writeDIExpression(llvm::raw_ostream&, llvm::DIExpression const*, (anonymous namespace)::TypePrinting*, llvm::SlotTracker*, llvm::Module const*) in libLLVMCore.a(AsmWriter.cpp.o)
WriteMDNodeBodyInternal(llvm::raw_ostream&, llvm::MDNode const*, (anonymous namespace)::TypePrinting*, llvm::SlotTracker*, llvm::Module const*) in libLLVMCore.a(AsmWriter.cpp.o)
"llvm::dwarf::OperationEncodingString(unsigned int)", referenced from:
writeDIExpression(llvm::raw_ostream&, llvm::DIExpression const*, (anonymous namespace)::TypePrinting*, llvm::SlotTracker*, llvm::Module const*) in libLLVMCore.a(AsmWriter.cpp.o)
"llvm::dwarf::TagString(unsigned int)", referenced from:
(anonymous namespace)::MDFieldPrinter::printTag(llvm::DINode const*) in libLLVMCore.a(AsmWriter.cpp.o)
"llvm::remarks::parseFormat(llvm::StringRef)", referenced from:
llvm::setupLLVMOptimizationRemarks(llvm::LLVMContext&, llvm::StringRef, llvm::StringRef, llvm::StringRef, bool, llvm::Optional<unsigned long long>) in libLLVMCore.a(LLVMRemarkStreamer.cpp.o)
llvm::setupLLVMOptimizationRemarks(llvm::LLVMContext&, llvm::raw_ostream&, llvm::StringRef, llvm::StringRef, bool, llvm::Optional<unsigned long long>) in libLLVMCore.a(LLVMRemarkStreamer.cpp.o)
"llvm::remarks::RemarkStreamer::matchesFilter(llvm::StringRef)", referenced from:
llvm::LLVMRemarkStreamer::emit(llvm::DiagnosticInfoOptimizationBase const&) in libLLVMCore.a(LLVMRemarkStreamer.cpp.o)
"llvm::remarks::RemarkStreamer::setFilter(llvm::StringRef)", referenced from:
llvm::setupLLVMOptimizationRemarks(llvm::LLVMContext&, llvm::StringRef, llvm::StringRef, llvm::StringRef, bool, llvm::Optional<unsigned long long>) in libLLVMCore.a(LLVMRemarkStreamer.cpp.o)
llvm::setupLLVMOptimizationRemarks(llvm::LLVMContext&, llvm::raw_ostream&, llvm::StringRef, llvm::StringRef, bool, llvm::Optional<unsigned long long>) in libLLVMCore.a(LLVMRemarkStreamer.cpp.o)
"llvm::remarks::RemarkStreamer::RemarkStreamer(std::__1::unique_ptr<llvm::remarks::RemarkSerializer, std::__1::default_delete<llvm::remarks::RemarkSerializer> >, llvm::Optional<llvm::StringRef>)", referenced from:
llvm::setupLLVMOptimizationRemarks(llvm::LLVMContext&, llvm::StringRef, llvm::StringRef, llvm::StringRef, bool, llvm::Optional<unsigned long long>) in libLLVMCore.a(LLVMRemarkStreamer.cpp.o)
llvm::setupLLVMOptimizationRemarks(llvm::LLVMContext&, llvm::raw_ostream&, llvm::StringRef, llvm::StringRef, bool, llvm::Optional<unsigned long long>) in libLLVMCore.a(LLVMRemarkStreamer.cpp.o)
"llvm::remarks::createRemarkSerializer(llvm::remarks::Format, llvm::remarks::SerializerMode, llvm::raw_ostream&)", referenced from:
llvm::setupLLVMOptimizationRemarks(llvm::LLVMContext&, llvm::StringRef, llvm::StringRef, llvm::StringRef, bool, llvm::Optional<unsigned long long>) in libLLVMCore.a(LLVMRemarkStreamer.cpp.o)
llvm::setupLLVMOptimizationRemarks(llvm::LLVMContext&, llvm::raw_ostream&, llvm::StringRef, llvm::StringRef, bool, llvm::Optional<unsigned long long>) in libLLVMCore.a(LLVMRemarkStreamer.cpp.o)
"_del_curterm", referenced from:
llvm::sys::Process::FileDescriptorHasColors(int) in libLLVMSupport.a(Process.cpp.o)
"_set_curterm", referenced from:
llvm::sys::Process::FileDescriptorHasColors(int) in libLLVMSupport.a(Process.cpp.o)
"_setupterm", referenced from:
llvm::sys::Process::FileDescriptorHasColors(int) in libLLVMSupport.a(Process.cpp.o)
"_tigetnum", referenced from:
llvm::sys::Process::FileDescriptorHasColors(int) in libLLVMSupport.a(Process.cpp.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.

操作系统:MacOS(英特尔芯片(

IDE:CLion

直接链接到CMake中的库路径可能是最强烈的代码气味。这是CMake代码的溢出。不要打开那个罐子!

使用LLVM自己的CMake支持:

cmake_minimum_required(VERSION 3.22)
project(absturz)
set(CMAKE_CXX_STANDARD 14)
find_package(LLVM 13 REQUIRED)
llvm_map_components_to_libnames(
LLVM_LIBRARIES
Core
Support
)
add_executable(absturz main.cpp lang/Lexer.h lang/Token.h lang/src/Token.cpp lang/src/Lexer.cpp lang/Compiler.h lang/src/Compiler.cpp)
target_include_directories(absturz PRIVATE ${LLVM_INCLUDE_DIRS})
target_compile_definitions(absturz PRIVATE ${LLVM_DEFINITIONS})
target_link_libraries(absturz PRIVATE ${LLVM_LIBRARIES})

最新更新