链接到同一可执行文件中的LLDB和clang

时间:2017-04-26 16:03:05

标签: c++ llvm lldb llvm-clang llvm-c++-api

我正在尝试创建一个使用LLDB和clang(C ++ API,而不是libclang C API)的exectuable,但是我遇到了一个错误:clang静态初始化它的命令行参数,因为LLDB有它自己的副本clang链接在,然后它被初始化两次,我得到这个错误: : CommandLine Error: Option 'enable-value-profiling' registered more than once! LLVM ERROR: inconsistency in registered CommandLine options

重现的步骤

编译文件

// main.cpp
#include <memory>

#include <clang/CodeGen/CodeGenAction.h>

int main() {
    auto compilerAction = std::make_unique<clang::EmitLLVMOnlyAction>(nullptr);
}

使用命令行

g++  main.cpp  -std=c++14 \
    -llldb \
    -lclangRewrite -lclangFrontendTool -lclangCodeGen \
    -lclangFrontend -lclangParse -lclangSerialization \
    -lclangSerialization -lclangSema -lclangEdit -lclangAnalysis \
    -lclangAST -lclangLex -lclangDriver -lclangBasic -lLLVM

然后运行它:

./a.out

我的环境

我正在运行一个完全更新的Arch Linux,LLVM 4.0版,它是这样构建的LLVM 4:

  cmake \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_INSTALL_PREFIX=/usr \
    -DLLVM_BUILD_LLVM_DYLIB=ON \
    -DLLVM_LINK_LLVM_DYLIB=ON \
    -DLLVM_INSTALL_UTILS=ON \
    -DLLVM_ENABLE_RTTI=ON \
    -DLLVM_ENABLE_FFI=ON \
    -DLLVM_BUILD_TESTS=ON \
    -DLLVM_BUILD_DOCS=ON \
    -DLLVM_ENABLE_SPHINX=ON \
    -DLLVM_ENABLE_DOXYGEN=OFF \
    -DLLDB_DISABLE_LIBEDIT=1 \
    -DSPHINX_WARNINGS_AS_ERRORS=OFF \
    -DFFI_INCLUDE_DIR=$(pkg-config --variable=includedir libffi) \
    -DLLVM_BINUTILS_INCDIR=/usr/include \
    .. && make

导致问题的事情不会发生:

  1. 从命令行中删除-llldb
  2. 删除主
  3. 中的该函数调用

    对我来说有意义的是一个好的解决方案只是链接到lldb而不是clang,并依赖于lldb的clang副本来调用clang。这似乎不起作用,我得到链接器错误:

    $ clang++  main.cpp -I .. -std=c++14 -llldb -lLLVM           
    /tmp/main-14b759.o: In function `std::_MakeUniq<clang::EmitLLVMOnlyAction>::__single_object std::make_unique<clang::EmitLLVMOnlyAction, decltype(nullptr)>(decltype(nullptr)&&)':
    main.cpp:(.text._ZSt11make_uniqueIN5clang18EmitLLVMOnlyActionEJDnEENSt9_MakeUniqIT_E15__single_objectEDpOT0_[_ZSt11make_uniqueIN5clang18EmitLLVMOnlyActionEJDnEENSt9_MakeUniqIT_E15__single_objectEDpOT0_]+0x51): undefined reference to `clang::EmitLLVMOnlyAction::EmitLLVMOnlyAction(llvm::LLVMContext*)'
    clang-4.0: error: linker command failed with exit code 1 (use -v to see invocation)
    

0 个答案:

没有答案