使用 CMake for LLVM 链接共享库

问题描述 投票:0回答:1

我尝试使用 CMake 编译我的 LLVM 项目(共享库)。 在链接阶段出现问题。

我使用本教程:http://llvm.org/docs/CMake.html#developing-llvm-passes-out-of-source

project_dir/
     |
     CMakeLists.txt
     <passName>/
         |
         CMakeLists.txt
         sourceFile1.cpp
         sourceFile2.cpp
         …

project_dir/CMakeLists.txt 的内容:

cmake_minimum_required(VERSION 3.4.3) project(MyProjectSharedLib)
find_package(LLVM REQUIRED CONFIG)
list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_DIR}") 
include(AddLLVM)
message(STATUS "!!! Found LLVM ${LLVM_PACKAGE_VERSION}")
message(STATUS "!!! Using LLVMConfig.cmake in: ${LLVM_DIR}")
set (CMAKE_CXX_STANDARD 11)
include_directories(${LLVM_INCLUDE_DIRS})
add_definitions(${LLVM_DEFINITIONS})
add_subdirectory(passName)

project_dir/passName/CMakeLists.txt 的内容:

add_llvm_loadable_module(MyProjectSharedLib
    sourceFile1.cpp
    sourceFile2.cpp
    …
)

编译和链接后创建了一个共享库MyProjectSharedLib.so,但是当我运行Clang或Opt并使用此库时出现错误:

错误:无法加载插件 '/path-to-my-shared-lib/MyProjectSharedLib.so': '/path-to-my-shared-lib/MyProjectSharedLib.so:未定义的符号: _ZN4llvm11RuntimeDyld13MemoryManager6anchorEv'

这意味着我的共享库中缺少一些定义符号。

当我添加project_dir/passName/CMakeLists.txt时:

llvm_map_components_to_libnames (llvm_libs irreader x86codegen mcjit) 
target_link_libraries(MyProjectSharedLib  ${llvm_libs})

行,其中包含到我的项目所需的库并消除依赖,然后又出现另一个错误:

命令行错误:选项“x86-use-base-pointer”注册超过 一次!致命错误:后端错误:注册不一致 命令行选项

我将不胜感激任何好的建议!

c++ cmake linker llvm
1个回答
0
投票

我在构建 Terra 编译器时看到了类似的问题。 Terra 编译器的作者 Elliott Slaughter 调查了这个问题并得出问题出在 LLVM 本身的构建方式上。

对我来说,这个问题是通过在 Docker 容器中构建一个项目来解决的。

© www.soinside.com 2019 - 2024. All rights reserved.