【问题标题】:order of imports for clang librariesclang 库的导入顺序
【发布时间】:2019-05-14 23:52:29
【问题描述】:

我正在编写自己的 Makefile 来编译包含以下代码的最小独立 clang 工具:

#include "clang/Tooling/CommonOptionsParser.h"
#include "clang/Tooling/Tooling.h"                                                                                                                                                   

using namespace clang;
using namespace clang::driver;
using namespace clang::tooling;

static llvm::cl::OptionCategory ToolingSampleCategory("MetaLift Clang Frontend");

int main (int argc, const char **argv)
{
  CommonOptionsParser op(argc, argv, ToolingSampleCategory);
  ClangTool Tool(op.getCompilations(), op.getSourcePathList());
  return 0;
}

是否有“正确”的顺序来导入 clang 库?我目前的订单是:

-lclangTooling -lclangSerialization -lclangFrontend 

但我一直遇到未定义符号的问题。

【问题讨论】:

    标签: clang llvm clang++ llvm-clang


    【解决方案1】:

    我发现使用 CMake 是构建基于 libTooling 的应用程序的最简单方法。这是一个用于编译示例的简约 sn-p:

    # CMakeLists.txt
    cmake_minimum_required(VERSION 3.12)
    
    # Find CMake file for Clang
    find_package(Clang REQUIRED)
    
    # Add path to LLVM modules
    set(CMAKE_MODULE_PATH
      ${CMAKE_MODULE_PATH}
      "${LLVM_CMAKE_DIR}"
      )
    
    # import LLVM CMake functions
    include(AddLLVM)
    
    include_directories(${LLVM_INCLUDE_DIRS})
    include_directories(${CLANG_INCLUDE_DIRS})
    
    add_definitions(${LLVM_DEFINITIONS})
    add_definitions(${CLANG_DEFINITIONS})
    
    add_llvm_executable(myTool main.cpp)
    set_property(TARGET myTool PROPERTY CXX_STANDARD 11)
    target_link_libraries(myTool PRIVATE clangTooling)
    
    // main.cpp
    #include "clang/Tooling/CommonOptionsParser.h"
    #include "clang/Tooling/Tooling.h"
    
    using namespace clang;
    using namespace clang::driver;
    using namespace clang::tooling;
    
    static llvm::cl::OptionCategory
        ToolingSampleCategory("MetaLift Clang Frontend");
    
    int main(int argc, const char **argv) {
      CommonOptionsParser op(argc, argv, ToolingSampleCategory);
      ClangTool Tool(op.getCompilations(), op.getSourcePathList());
      return 0;
    }
    

    我检查了构建期间发生的实际命令:

    c++  -DGTEST_HAS_RTTI=0 -I${CLANG}/include  -O3 -DNDEBUG -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk   -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS  -fno-exceptions -fno-rtti -std=gnu++11 -o CMakeFiles/myTool.dir/main.cpp.o -c /Users/vsavchenko/source/c++/clang-makefile/main.cpp
    
    c++  -O3 -DNDEBUG -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk -Wl,-search_paths_first -Wl,-headerpad_max_install_names  -Wl,-dead_strip CMakeFiles/myTool.dir/main.cpp.o  -o myTool -Wl,-rpath,@loader_path/../lib -Wl,-rpath,${CLANG}/lib ${CLANG}/lib/libclangTooling.a ${CLANG}/lib/libclangASTMatchers.a ${CLANG}/lib/libclangFormat.a ${CLANG}/lib/libclangFrontend.a ${CLANG}/lib/libclangDriver.a ${CLANG}/lib/libclangParse.a ${CLANG}/lib/libLLVMMCParser.a ${CLANG}/lib/libclangSerialization.a ${CLANG}/lib/libclangSema.a ${CLANG}/lib/libclangEdit.a ${CLANG}/lib/libclangAnalysis.a ${CLANG}/lib/libLLVMBitReader.a ${CLANG}/lib/libLLVMProfileData.a ${CLANG}/lib/libclangToolingCore.a ${CLANG}/lib/libclangAST.a ${CLANG}/lib/libclangRewrite.a ${CLANG}/lib/libclangLex.a ${CLANG}/lib/libclangBasic.a ${CLANG}/lib/libLLVMCore.a ${CLANG}/lib/libLLVMBinaryFormat.a ${CLANG}/lib/libLLVMMC.a ${CLANG}/lib/libLLVMOption.a ${CLANG}/lib/libLLVMSupport.a -lz -lcurses -lm /Users/vsavchenko/bin/clang/lib/libLLVMDemangle.a 
    

    看起来问题不在于 Clang 库的顺序,而在于它们的集合不足。以下命令完成且没有链接错误:

    LIBRARY_PATH=${CLANG}/lib clang++ -std=c++11 -lclangTooling -lclangASTMatchers -lclangFormat -lclangFrontend -lclangDriver -lclangParse -lLLVMMCParser -lclangSerialization -lclangSema -lclangEdit -lclangAnalysis -lLLVMBitReader -lLLVMProfileData -lclangToolingCore -lclangAST -lclangRewrite -lclangLex -lclangBasic -lLLVMCore -lLLVMBinaryFormat -lLLVMMC -lLLVMOption -lLLVMSupport -lz -lcurses -lLLVMDemangle -I${CLANG}/include main.cpp
    

    使用 Clang 愉快地进行黑客攻击!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-17
      • 1970-01-01
      • 2016-08-26
      • 1970-01-01
      • 2013-03-12
      • 1970-01-01
      • 2012-06-28
      相关资源
      最近更新 更多