windows系统下通过visual studio使用clang tooling

vs吃上clang tooling

通过源码编译clang

教程参考安装教程

作者本人亲身使用流程:

安装必备软件

  • Git:作者已经有了,自己查
  • CMake:作者已经有了,自己查
  • Visual Studio 2019或更高的版本:作者已经有了,自己查
  • Python:作者已经有了,自己查

GnuWin32 Tools:

  • 从这里下载下载地址
  • 解压
  • 设置环境变量:xxxx\gnuwin32\bin

拉取/下载git仓库

llvmGitHub仓库

  • 直接下载安装包

  • cmd通过git拉去:
    git clone https://github.com/llvm/llvm-project.git

编译

  • 在llvm-project文件夹下创建一个build文件夹
  • 在build文件夹中执行cmd命令cmake -DLLVM_ENABLE_PROJECTS=clang -G "Visual Studio 17 2022" -A x64 -Thost=x64 ..\llvm
    不过这里要注意换成你的vs版本,我的是Visual Studio 17 2022
  • ok之后会在build目录下生成一个LLVM.sln,双击打开。
  • 只生成clang(全生成也行,就是有点慢)

【插播一条简讯】

笔者在笔记本上编译的时候,出现了意想不到的炸裂情况------因为贫穷导致的堆内存不足。因为用的笔记本电脑内存比较少,只有16G,而vs编译的时候,默认最大并行数量是和CPU的核心数量一致的,导致用了过多内存,直接电脑卡死。这里的解决方案是查找VS如何修改编译的最大并行数量 ,直接改成1,或者其他,根据个人财力决定,简单来说就是:工具->选项->项目和解决方案->生成并运行->最大并行项目生成数->修改->确认。

在项目中使用clangTool

简单的例子,首先写cmake文件

txt 复制代码
cmake_minimum_required(VERSION 3.10)
project(MyLibToolingProject)

# 设置自定义 LLVM/Clang 路径,这个是上一步编译的时候生成的地址
set(LLVM_DIR "E:/llvm-project/build/lib/cmake/llvm" CACHE PATH "")
set(Clang_DIR "E:/llvm-project/build/lib/cmake/clang" CACHE PATH "")

# 查找LLVM和Clang,这里的查找是基于上一步设置的LLVM_DIR和Clang_DIR进行查找的(若没有这两个路径还有通过其他方式)
find_package(LLVM REQUIRED CONFIG)
find_package(Clang REQUIRED CONFIG)

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

# 添加LLVM和Clang的包含目录
include_directories(${LLVM_INCLUDE_DIRS})
include_directories(${CLANG_INCLUDE_DIRS})
add_definitions(${LLVM_DEFINITIONS})

# 添加可执行文件,我这里只有一个main.cpp
add_executable(my-tool main.cpp)

# 链接必要的LLVM和Clang库
target_link_libraries(my-tool
  PRIVATE
  clangTooling
  clangFrontend
  clangAST
  clangBasic
  ${LLVM_LIBRARIES}
)

# 设置C++标准
set_target_properties(my-tool PROPERTIES
  CXX_STANDARD 17
  CXX_STANDARD_REQUIRED ON
)

main.cpp文件中这样

cpp 复制代码
#include "iostream"
#include "clang/ASTMatchers/ASTMatchFinder.h"
#include "clang/ASTMatchers/ASTMatchers.h"
#include "clang/Tooling/CommonOptionsParser.h"
#include "clang/Tooling/Tooling.h"

using namespace clang;
using namespace clang::tooling;
using namespace clang::ast_matchers;

class DerivedFromDbObjectCallback : public MatchFinder::MatchCallback {
public:
  void run(const MatchFinder::MatchResult &Result) override {
    const CXXRecordDecl *Decl =
        Result.Nodes.getNodeAs<CXXRecordDecl>("derivedClass");
    if (!Decl)
      return;

    std::cout << "Class derived from DbObject found: "
              << Decl->getNameAsString() << std::endl;

    std::cout << "Non-static member variables:\n";
    for (const FieldDecl *Field : Decl->fields()) {
      std::cout << "  - " << Field->getNameAsString() << std::endl;
    }

    const CXXMethodDecl *SaveFunc =
        Result.Nodes.getNodeAs<CXXMethodDecl>("saveFunc");
    if (SaveFunc == nullptr || !SaveFunc->hasBody()) {
      return;
    }
  }
};

int main(int argc, const char **argv) {
  std::string errorMsg;
  auto cmpData =
      CompilationDatabase::loadFromDirectory("E:/CppTest/astTest", errorMsg);
  if (!errorMsg.empty()) {
    std::cout << errorMsg << std::endl;
  }
  if (cmpData.get() == nullptr) {
    return 1;
  }
  std::vector<std::string> sourceFilesPath;
  for (const auto &path : cmpData->getAllCompileCommands()) {
    sourceFilesPath.push_back(path.Filename);
  }
  ClangTool Tool(*cmpData, sourceFilesPath);
  MatchFinder Finder;
  DerivedFromDbObjectCallback Callback;

  // 匹配所有直接或间接继承自 DbObject 的类声明
  auto Matcher =
      cxxRecordDecl(
          isDerivedFrom("DbObject"))
          .bind("derivedClass");

  Finder.addMatcher(Matcher, &Callback);
  return Tool.run(newFrontendActionFactory(&Finder).get());
}

在cmd中的操作,其中,cmake.txt和main.cpp是在同一文件夹下,下边的操作是基于这个文件的继续操作,我用的是Vs2022,如果不是,需要改。

cmd 复制代码
> mkdir build  #生成build文件夹
> cd build #移动到build文件夹
> cmake -G "Visual Studio 17 2022" -A x64 .. #编译

完事会发现在build中生成了一个sln项目,打开编译,不报错就ok了。

(main.cpp的具体内容先不管了,反正能编译成功就说明成功了)。

相关推荐
未来之窗软件服务8 分钟前
搭建 Select 三级联动架构-东方仙盟插件开发 JavaScript ——仙盟创梦IDE
开发语言·javascript·ide·仙盟创梦ide·东方仙盟皮肤·东方仙盟·东方仙盟插件
敲代码的瓦龙1 小时前
C++?多态!!!
c语言·开发语言·c++·windows·后端
Dylan Hill3 小时前
Visual Studio+SQL Server数据挖掘
数据挖掘·visual studio
全栈技术负责人3 小时前
cursor rules设置:让cursor按执行步骤处理(分析需求和上下文、方案对比、确定方案、执行、总结)
数据库·windows·microsoft
CodingInCV3 小时前
cursor/vscode连接低版本的系统(glibc<2.28)
ide·vscode·编辑器
wxjlkh7 小时前
vSphere 7.0 client 提示HTTP状态 500- 内部服务器错误
服务器·windows·http
fanwenhu14 小时前
Ini配置文件读写,增加备注功能
windows·microsoft
依旧天真无邪16 小时前
WPS 免登录解锁编辑
windows·经验分享·wps
不穿铠甲的穿山甲16 小时前
Intellij IDEA 查找接口实现类的快捷键
java·ide·intellij-idea
CodingKnight16 小时前
IntelliJ IDEA Ultimate修改软件地区使用
java·ide·intellij-idea