【问题标题】:What is a correct way to solve undefined reference to undefined reference to `LLVMInitializeAArch64TargetInfo'解决对“LLVMInitializeAArch64TargetInfo”的未定义引用的未定义引用的正确方法是什么
【发布时间】:2020-04-13 13:02:07
【问题描述】:

在 Clion 中,当我构建 llvm 项目时,我收到以下消息:

CMakeFiles/codegen_llvm.dir/main.cpp.o: In function `llvm::InitializeAllTargetInfos()':
/usr/lib/llvm-9/include/llvm/Config/Targets.def:26: undefined reference to `LLVMInitializeAArch64TargetInfo'
/usr/lib/llvm-9/include/llvm/Config/Targets.def:27: undefined reference to `LLVMInitializeAMDGPUTargetInfo'
/usr/lib/llvm-9/include/llvm/Config/Targets.def:28: undefined reference to `LLVMInitializeARMTargetInfo'
/usr/lib/llvm-9/include/llvm/Config/Targets.def:29: undefined reference to `LLVMInitializeBPFTargetInfo'
/usr/lib/llvm-9/include/llvm/Config/Targets.def:30: undefined reference to `LLVMInitializeHexagonTargetInfo'
/usr/lib/llvm-9/include/llvm/Config/Targets.def:31: undefined reference to `LLVMInitializeLanaiTargetInfo'

我的 CmakeLists 在这里:

cmake_minimum_required(VERSION 3.15)
project(codegen_llvm)
find_package(LLVM REQUIRED CONFIG)

message(STATUS "Found ${LLVM_PACKAGE_VERSION}")
message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}")

include_directories(${LLVM_INCLUDE_DIRS})
add_definitions(${LLVM_DEFINITIONS})

set(CMAKE_CXX_STANDARD 14)

add_executable(codegen_llvm main.cpp)

llvm_map_components_to_libnames(llvm_libs support core irreader executionEngine)
target_link_libraries(codegen_llvm  ${llvm_libs})
...

我该怎么办?

【问题讨论】:

    标签: cmake llvm


    【解决方案1】:

    cmake解决方案

    cmake_minimum_required(VERSION 3.10)
    project(project_name )
    
    set(CMAKE_CXX_STANDARD 17)
    set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
    
    set(CMAKE_C_COMPILER clang)
    set(CMAKE_CXX_COMPILER clang++)
    
    link_libraries()
    execute_process(COMMAND llvm-config --libs OUTPUT_VARIABLE LIBS)
    execute_process(COMMAND llvm-config --system-libs OUTPUT_VARIABLE SYS_LIBS)
    execute_process(COMMAND llvm-config --ldflags OUTPUT_VARIABLE LDF)
    #message(STATUS "Found LLVM" ${LIBS})
    
    string(STRIP ${LIBS} LIBS)
    string(STRIP ${SYS_LIBS} SYS_LIBS)
    string(STRIP ${LDF} LDF)
    
    link_libraries(${LIBS} ${SYS_LIBS} ${LDF})
    
    execute_process(COMMAND llvm-config --cxxflags OUTPUT_VARIABLE CMAKE_CXX_FLAGS)
    string(STRIP ${CMAKE_CXX_FLAGS} CMAKE_CXX_FLAGS)
    
    add_executable(project_name   toy.cpp)
    

    一个班轮

    clang++ -g toy.cpp $(llvm-config --cxxflags --ldflags --system-libs --libs) -O3 -o toy
    

    【讨论】:

      【解决方案2】:

      在您的最后一行中,config 不是 llvm 组件,因此您希望将其删除。要查看官方组件列表,请使用llvm-config --components 命令。

      【讨论】:

      • 但是当我删除配置时它有这样的错误:``` undefined reference to `LLVMInitializeAArch64TargetInfo' ```
      • 尝试链接所有可链接的 llvm 库。删除或注释最后一行并将最后一行替换为target_link_libraries(codegen_llvm ${llvm-config --libs})
      • 也许你的 target_link_libraries Clion 会显示错误。
      • @droptop,您的代码导致:when parsing string${llvm-configsyntax error, unexpected $end, expecting }
      【解决方案3】:

      如果您仍然没有解决此错误的方法,请尝试将${LLVM_TARGETS_TO_BUILD} 添加到您的链接库中。

      我也在使用 CLion,我通过更改解决了这个问题:

      llvm_map_components_to_libnames(llvm_libs support core irreader codegen mc mcparser option)

      到:

      llvm_map_components_to_libnames(llvm_libs ${LLVM_TARGETS_TO_BUILD} support core irreader codegen mc mcparser option)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-27
        • 1970-01-01
        • 2012-08-15
        • 1970-01-01
        • 1970-01-01
        • 2013-09-12
        • 1970-01-01
        相关资源
        最近更新 更多