我正在尝试创建一个使用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
-llldb
对我来说有意义的是一个好的解决方案只是链接到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)