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

article/2025/8/28 16:54:43

vs吃上clang tooling

  • 通过源码编译clang
    • 安装必备软件
      • GnuWin32 Tools:
    • 拉取/下载git仓库
    • 编译
  • 在项目中使用clangTool

通过源码编译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文件

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-toolPRIVATEclangToolingclangFrontendclangASTclangBasic${LLVM_LIBRARIES}
)# 设置C++标准
set_target_properties(my-tool PROPERTIESCXX_STANDARD 17CXX_STANDARD_REQUIRED ON
)

main.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,如果不是,需要改。

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

完事会发现在build中生成了一个sln项目,打开编译,不报错就ok了。
(main.cpp的具体内容先不管了,反正能编译成功就说明成功了)。


http://www.hkcw.cn/article/cAaYeyjYMr.shtml

相关文章

路由器、网关和光猫三种设备有啥区别?

无论是家中Wi-Fi信号的覆盖&#xff0c;还是企业网络的高效运行&#xff0c;路由器、网关和光猫这些设备都扮演着不可或缺的角色。然而&#xff0c;对于大多数人来说&#xff0c;这三者的功能和区别却像一团迷雾&#xff0c;似懂非懂。你是否曾疑惑&#xff0c;为什么家里需要光…

攻防世界János-the-Ripper

打开压缩包是一个文件&#xff0c;用010Editor打开可以发现里面有隐藏文件flag.txt 此时想到分离文件&#xff0c;利用binwalk工具 利用binwalk生成出的是一个压缩包&#xff0c;解压缩但是发现竟然解压需要密码 这里就可以开始暴力破解密码了&#xff0c;这里我用的是ARCHPR工…

酷派Cool20/20S/30/40手机安装Play商店-谷歌三件套-GMS方法

酷派Cool系列主打低端市场&#xff0c;系统无任何GMS程序&#xff0c;也不支持直接开启或者安装谷歌服务等功能&#xff0c;对于国内部分经常使用谷歌服务商店的小伙伴非常不友好。涉及机型有酷派Cool20/Cool20S /30/40/50/60等旗下多个设备。好在这些机型运行的系统都是安卓11…

本地部署大模型llm+RAG向量检索问答系统 deepseek chatgpt

项目视频讲解: 本地部署大模型llm+RAG向量检索问答系统 deepseek chatgpt_哔哩哔哩_bilibili 运行结果:

并查集 c++函数的值传递和引用传递 晴神问

目录 学校的班级个数 手推7个班级&#xff0c;答案17&#xff1f;怀疑人生 破案了&#xff0c;应该是6个班。 破案了&#xff0c;原来写的是 unionxy(a, b, father); c if两个数同时为正或为负 简洁写法 可以用位运算&#xff1f; c可以这样赋值吗&#xff1f;ab2 典型…

Dynamics 365 Business Central AI Sales Order Agent Copilot

#AI Copilot# #D365 BC 26 Wave# 最近很多客户都陆续升级到 Dynamics 365 Business Central 26 wave, Microsoft 提供一个基于Copilot 的Sales Order Agent&#xff0c;此文将此功能做个介绍. Explorer: 可以看到26版本上面增加了这样一个新图标。 Configuration: 配置过程…

Webug4.0靶场通关笔记03- 第3关SQL注入之时间盲注(手注法+脚本法 两种方法)

目录 一、源码分析 1.分析闭合 2.分析输出 &#xff08;1&#xff09;查询成功 &#xff08;2&#xff09;查询失败 &#xff08;3&#xff09;SQL语句执行报错 二、第03关 延时注入 1.打开靶场 2.SQL手注 &#xff08;1&#xff09;盲注分析 &#xff08;2&#xf…

NodeJS 基于 Koa, 开发一个读取文件,并返回给客户端文件下载,以及读取文件形成列表和文件删除的代码演示

前言 在上一篇文章 《Nodejs 实现 Mysql 数据库的全量备份的代码演示》 中&#xff0c;我们演示了如何将用户的 Mysql 数据库进行备份的代码。但是&#xff0c;这个备份&#xff0c;只是备份在了服务器上了。 而我们用户的真实需求&#xff0c;是需要将备份文件下载到本地进行…

中国自然灾害影响及损失数据

自然灾害往往会导致大量的人员伤亡和财产损失&#xff0c;数据集详细记载了2014-2020年中国自然灾害影响以及灾害造成的损失情况。其中包括地震、台风、雨雪、阵雨、雪灾、暴雨、旱灾、龙卷风、泥石流、山崩、泥石流、滑坡、洪涝等灾害事件。 数据集主要以excel的格式存储。属性…

UE5.5 pixelstreaming插件打包报错

文章目录 错误内容如下解决方案推流服务器不能使用 错误内容如下 The following files are set to be staged, but contain restricted folder names ("Linux"): CTZ5_5/Samples/PixelStreaming/WebServers/Extras/FrontendTests/dockerfiles/linux/Dockerfile CTZ5…

UE5打包项目设置Project Settings(打包widows exe安装包)

UE5打包项目Project Settings Edit-Project Settings- Packaging-Ini Section Denylist-Advanced 1&#xff1a;打包 2&#xff1a;高级设置 3&#xff1a;勾选创建压缩包 4&#xff1a;添加要打包地图Map的数量 5&#xff1a;选择要打包的地图Maps 6&#xff1a;Project-Bui…

全志F1c200开发笔记——移植Debian文件系统

1.搭建环境 sudo apt install qemu-user-static -y sudo apt install debootstrap -y mkdir rootfs 2.拉取文件系统 这边我参照墨云大神的文档&#xff0c;但是华为镜像已经没有armel了&#xff0c;我找到了官方仓库&#xff0c;还是有的&#xff0c;拉取速度比较慢 sudo d…

多模态大语言模型arxiv论文略读(九十九)

PartGLEE: A Foundation Model for Recognizing and Parsing Any Objects ➡️ 论文标题&#xff1a;PartGLEE: A Foundation Model for Recognizing and Parsing Any Objects ➡️ 论文作者&#xff1a;Junyi Li, Junfeng Wu, Weizhi Zhao, Song Bai, Xiang Bai ➡️ 研究机构…

SpringCloud基础知识

学习视频链接:SpringCloud | 黑马程序员 文章目录 NacosDocker部署1.拉取镜像2.运行nacos3.测试 Nacos介绍核心功能&#xff1a;基本概念&#xff1a;部署模式&#xff1a;1.单机模式&#xff08;Standalone&#xff09;2.集群模式&#xff08;Cluster&#xff09;3.云原生部署…

12-后端Web实战(登录认证)

在前面的课程中&#xff0c;我们已经实现了部门管理、员工管理的基本功能&#xff0c;但是大家会发现&#xff0c;我们并没有登录&#xff0c;就直接访问到了Tlias智能学习辅助系统的后台。 这是不安全的&#xff0c;所以我们今天的主题就是登录认证。最终要实现的效果是&#…

CppCon 2014 学习第4天:Transactional Language Constructs for C++ TS(未进入到标准)

事务性编程 “Transactional Language Constructs for C TS”指的是在C技术规范&#xff08;Technical Specification, TS&#xff09;中提出的一套用于支持**事务性编程&#xff08;Transactional Programming&#xff09;**的语言构造。 什么是事务性编程&#xff1f; 事务…

【论文阅读】《PEACE: Empowering Geologic Map Holistic Understanding with MLLMs》

目录 前言一、研究背景与问题1-1、地质图的重要性1-2、现有MLLMs的不足 二、 主要贡献2-1、GeoMap-Bench&#xff1a;首个地质图理解评估基准2-2、GeoMap-Agent&#xff1a;首个地质图专用AI代理2-3、实验验证与性能优势 三、关键技术3-1、 数据构建与预处理3-2、分层信息提取&…

React 编译器 RC

&#x1f916; 作者简介&#xff1a;水煮白菜王&#xff0c;一位前端劝退师 &#x1f47b; &#x1f440; 文章专栏&#xff1a; 前端专栏 &#xff0c;记录一下平时在博客写作中&#xff0c;总结出的一些开发技巧和知识归纳总结✍。 感谢支持&#x1f495;&#x1f495;&#…

简单三步FastAdmin 开源框架的安装

简单三步FastAdmin 开源框架的安装 第一步&#xff1a;新建站点1&#xff0c;在宝塔面板中&#xff0c;创建一个新的站点&#xff0c;并填写项目域名。 第二步&#xff1a;上传框架1&#xff0c;框架下载2&#xff0c;上传解压缩 第三步&#xff1a;配置并安装1&#xff0c;进入…

Chuanpai、Nihongo wa Muzukashii Desu、K-skip Permutation

一、Chuanpai 题目描述 川牌是四川传统纸牌&#xff0c;每张牌标记两个整数 x 和 y&#xff08;1≤x≤y≤6&#xff09;。给定整数 k&#xff0c;要求统计满足 xyk 的不同牌型数量。两张牌类型不同当且仅当 (x1​,y1​) 和 (x2​,y2​) 不同&#xff08;即 x1​x2​ 或 y1​y…