VS Code 为 Clang for MSVC 配置 cmake cmake tools

news2025/2/25 14:31:07

介绍

  在windows平台上,由于平台API差异过大,一般为linux设计的项目(POSIX兼容)无法通过MSVC的编译,而是会报非常多的头文件错误。如果要修改,工程量将巨大。Windows平台上,主要有两个类POSIX兼容平台,可以在Windows系统上编译运行为Linux编写的程序(功能支持不完整)。

  1. MinGW Minimalist GNU for Windows: 是将GCC编译器和GNU工具链套件移植到Windows平台下的产物。
  2. LLVM/Clang for Windows: Clang编译器对Windows Target的适配。由于LLVM框架的结构,只需要开发Windows平台对应的后端,而不需要进行迁移。LLVM在Windows平台的后端主要采用Visual Studio的MSVC编译器。

  cmake是一个跨平台项目编译工具,通过CMakeLists.txt文件,可以方便地管理项目文件,并灵活地组织编译。根据工具链的不同,编译结果可以应用于各个平台上。例如,Linux系统中,cmake可以编译出Makefile,并交给linux平台的make程序进行编译。

  一个项目需要在Windows平台上编译,但是是面向linux编写的(Makefile),这时候就需要使用Windows平台上的工具链进行编译。但是,多文件项目管理复杂,一个一个文件进行编译较为繁琐,这时候,就可以使用cmake工具辅助进行编译

  笔者是VS Code重度依赖用户,所以在VS Code上利用cmake tools进行配置。当然也可以使用命令行或是cmake-gui进行配置,只不过cmake tools更加集成和方便。

安装Clang-CL & CMake

Clang-CL for MSVC可以在Visual Studio的组件中找到

在这里插入图片描述

CMake可以在官网下载,安装后注意检查PATH,是否添加cmake

CMake & Toolkits

我们应当明确几个编译概念:

  • Build System 编译系统:又称为Generator 生成器,是编译工具根据规则编译、链接文件的系统,按照是否集成交互,可分为;
    • IDE Build Tool Generators 用于IDE的Build System,生成的项目可以直接被IDE打开、编辑,例如Visual Studio Generators
    • Command-Line Build Tool Generators,使用命令行进行编译构建,有编译工具链即可工作,不需要IDE支持,例如,Make构建系统(即Linux中使用Makefile进行构建的系统),以及Ninja(一套更轻量的命令行构建系统,是CMake Tools 的默认构建系统)
  • Build Toolkits 编译工具链:是直接参与编译、生成可执行文件的一系列工具,包括Compiler 编译器, Linker 链接器等。主流的工具链如下:
    • GNU/GCC: GNU项目组的编译工具链,主要运用于Linux系统,其在Windows上的迁移版本称为MingGW
    • LLVM/Clang:LLVM编译基础设施,采用模块化设计,前后端分离工作,能够很好地适配多种前端语言和后端平台,是越来越流行的编译工具链
    • Visual C++:微软开发的C/C++编译工具链,集成在Visual Studio上,主要用于Windows平台下的程序开发,即MSVC

编译系统使用编译工具链,按照开发者指定的编译规则进行程序的编译链接。那么,CMake属于哪里?CMake 属于更上一层的编译工具,使用CMake,可以生成任何一种适配的Build System所需要的规则,然后再调用这些Build System进行程序编译。

配置 cmake toolkits

在VS Code中,安装插件CMake Tools,并在项目目录中创建CMakeLists.txt文件,插件被激活后,状态栏会显示CMake Toolkits, Build Variant, Build Target等信息。如果是第一次在项目中使用插件,Toolkits工具链会显示No Kit Selected,单击该按钮,出现选择框。

在这里插入图片描述
初次配置,点击Scan for kits,工具会自动扫描电脑上安装的工具链。

Clang for MSVC 对应有四条(名称已经被我修改,正常情况下还有版本信息),Build Target有x86和x64,命令行接口有GNU CLI和MSVC CLI。

接下来,检查工具链配置参数,Ctrl+Shift+P,打开Command Palette,输入cmake kits -> 编辑用户本地CMake 工具包,这会打开一个json文件。
在这里插入图片描述

部分配置如下:

  {
    "name": "Clang 14.0.5 (GNU CLI) for MSVC (VS Community 2022 Release - x86)",
    "visualStudio": "8b689476",
    "visualStudioArchitecture": "x86",
    "compilers": {
      "C": "C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\Llvm\\bin\\clang.exe",
      "CXX": "C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\Llvm\\bin\\clang.exe"
    }
  },
  {
    "name": "Clang 14.0.5 (MSVC CLI) for MSVC (VS Community 2022 Release - x64)",
    "visualStudio": "8b689476",
    "visualStudioArchitecture": "x64",
    "preferredGenerator": {
      "name": "Visual Studio 17 2022",
      "platform": "x64",
      "toolset": "ClangCL"
    },
    "compilers": {
      "C": "C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\Llvm\\x64\\bin\\clang-cl.exe",
      "CXX": "C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\Llvm\\x64\\bin\\clang-cl.exe"
    }
  },
  • 对于MSVC CLI,Scan kit默认配置为MSVC Generator,注意检查toolset,必须修改为ClangCL,若为host=xxx,则仍将通过传统MSVC工具链编译,仍会遇到API不适配问题
  • 对于GNU CLI,默认配置为Ninja Generator,是一套轻量级、高效率的命令行构建系统,也可以根据需要修改preferredGenerator为MSVC工具链

编译与常用选项

状态栏选项

在这里插入图片描述

  • Build Variant (构建变体,编译选项……XD, anyway):选择工具链的编译输出模式,常见的有Debug调试模式(包含调试信息)、Release发布模式(去除调试信息,增加优化)
  • ToolKits 工具链:为项目选择编译工具链(跨平台项目使用交叉编译工具链)
  • Build 编译:点击编译(Not install)
  • Build Target:编译目标,选择编译哪个项目,默认为[all]全部编译,但是速度很慢,注意更换
  • Debug\Run:调试、运行,不多介绍

Command Palette 命令选项卡

使用命令选项卡可以进行更加完整的配置,常用的有两个:

  • CMake Clean:清除编译文件
  • CMake Install:进行编译安装,将按照CMakeLists.txt指定的安装配置进行生成工具的安装

示例

在一个目录下,创建如下文件

G:.
│  CMakeLists.txt
├─include
│      hello_lib.h
├─lib
│  │  CMakeLists.txt
│  ├─include
│  │      hello_lib.h
│  └─src
│          hello_lib.c
└─src
        hello.c
// hello.c
#include <Windows.h>
#include <stdio.h>
#include "hello_lib.h"

int main() {
	printf("Hello World!\n");
	DbgPrint("%s\n", "Hello World");	// defined in hello_lib
	return 0;
}
// hello_lib.h
#include <Windows.h>
#include <stdio.h>
#include <debugapi.h>
#include <stdarg.h>

void DbgPrint(char* FormatStr, ...);
// hello_lib.c
#include "hello_lib.h"

void DbgPrint(char* FormatStr, ...)
{
	char dbgout[1000];
	va_list vaList;

	va_start(vaList, FormatStr);
	sprintf(dbgout, FormatStr, vaList);
	OutputDebugStringA(dbgout);
	va_end(vaList);
}

然后配置CMakeLists:

root

cmake_minimum_required(VERSION 3.0)

project(HELLO)

add_subdirectory(lib)

aux_source_directory(src src_dir)
add_executable(hello ${src_dir})

target_include_directories(hello PUBLIC ${PROJECT_SOURCE_DIR}/include)
target_link_libraries(hello PUBLIC hello_lib)
  • add_subdirectory 增加子项目
  • target_link_libraries 链接库,hello_lib在子项目中定义

lib

cmake_minimum_required(VERSION 3.0)

project(HELLO_LIB)

aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src src_dir)
add_library(hello_lib STATIC ${src_dir})

target_include_directories(hello_lib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
  • add_library(STATIC)添加静态库

最后,build,输出结果:

[build]   hello_lib.vcxproj -> G:\C\Cmake Test\build\lib\Debug\hello_lib.lib
[build]   hello.c
[build]   hello.vcxproj -> G:\C\Cmake Test\build\Debug\hello.exe
[build] Build finished with exit code 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/146707.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JavaScript】事件--总结

千锋 1.Event 对象 代表事件的状态&#xff0c;比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。 div{width: 200px;height: 200px;background-color: yellow;} </style> <body><input type"text" id"username"&…

JavaScript 事件

文章目录JavaScript 事件HTML 事件常见的HTML事件JavaScript 可以做什么?JavaScript 事件 HTML 事件是发生在 HTML 元素上的事情。 当在 HTML 页面中使用 JavaScript 时&#xff0c; JavaScript 可以触发这些事件。 HTML 事件 HTML 事件可以是浏览器行为&#xff0c;也可以是…

babel做兼容处理 到底怎么使用?

1.背景 日常项目开发中总是避免不了对低版本浏览器做一些兼容处理&#xff0c;最常见的手段就是结合编译工具使用babel来处理一些语法的兼容&#xff0c;但是每次使用的时候其实Babel的配置和使用到的相关库总是云里雾里&#xff0c;网上的各种推荐方案眼花缭乱不知道到底应该…

自定义DotNetCore 项目模板

在进行代码开发时候&#xff0c;各自的团队或者公司都会有服务自己要求的项目代码模板&#xff0c;再创建新的项目时&#xff0c;都需要按照模板规范进行定义&#xff0c;NET支持自定义项目模板&#xff0c;这样在进行项目创建时就会高效很多。 官方参考文档&#xff1a;dotne…

软测复习01:软件测试概述

文章目录软件测试的目的软件测试的定义软件测试与软件开发软件测试发展软件测试的目的 基于不同的立场&#xff0c;存在着两种完全不同的测试目的 从用户的角度出发&#xff0c;希望通过软件测试暴露软件中隐藏的错误和缺陷&#xff0c;以考虑是否可接受该产品。从软件开发者的…

Java当中的定时器

目录 一、什么是定时器 二、Java当中的定时器 ①schedule()方法&#xff1a; ②TimerTask ​编辑 ③delay 三、实现一个定时器 前提条件: 代码实现: ①确定一个“任务”&#xff08;MyTask)的描述&#xff1a; ②schedule方法&#xff1a; ③需要一个计时器 属性…

MAT-内存泄漏工具使用

目录 一、MAT简介 1.1 MAT介绍 1.2 MAT工具的下载安装 二、使用MAT基本流程 2.1 获取HPROF文件 2.2 MAT主界面介绍 2.3 MAT中的概念介绍 2.3.1 Shallow heap 2.3.2 Retained Heap 2.3.3 GC Root 2.4 MAT中的一些常用的视图 2.4.1 Thread OvewView 2.4.2 Group 2.…

复杂工况下少样本轴承故障诊断的元学习

摘要&#xff1a;近年来&#xff0c;基于深度学习的轴承故障诊断得到了较为系统的研究。但是&#xff0c;这些方法中的大多数的成功在很大程度上依赖于大量的标记数据&#xff0c;而这些标记数据在实际生产环境中并不总是可用的。如何在有限的数据条件下训练出鲁棒的轴承故障诊…

线程状态到底是5种还是六种?傻傻分不清楚

目录 从操作系统层面上描述线程状态 从javaAPI层面上理解线程的6种状态 线程的状态转换. NEW --> RUNNABLE 1.RUNNABLE <--> WAITING 2.RUNNABLE <--> WAITING 3.RUNNABLE <--> WAITING 1.RUNNABLE <--> TIMED_WAITING 2.RUNNABLE <--&…

开源天气时钟项目删减和更新

开源天气时钟项目删减和更新&#x1f4cc;原项目开源地址&#xff1a;https://gitee.com/liuzewen/ESP8266-SSD1306-Watch-mini ✨本文只针对Arduino IDE平台代码进行删减和更新。 &#x1f4fa;按键菜单功能 &#x1f33c;天气时钟功能整体架构描述 代码中所使用的库&…

【MySQL】十,SQL执行流程

MySQL中的SQL执行流程 MySQL的查询流程 查询缓存 Server 如果在查询缓存中发现了这条 SQL 语句&#xff0c;就会直接将结果返回给客户端 如果没有&#xff0c;就进入到解析阶段&#xff08;MySQL 8.0 已经废弃了查询缓存功能&#xff09;。 解析器 在解析器中对 SQL 语句进行…

36、基于STM32的电子闹钟(DS1302)

编号&#xff1a;36 基于STM32的电子闹钟&#xff08;DS1302&#xff09; 功能描述&#xff1a; 本设计由STM32单片机液晶1602按键DS1302时钟模块声光报警模组成。 1、采用STM32F103最小系统。 2、利用DS1302芯片提供时钟信号 3、液晶1602实时显示年月日、时分秒、星期等信息…

java线程池原理

背景&#xff1a;为什么需要线程池java中的线程池是运用场景最多的并发框架&#xff0c;几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中&#xff0c;合理的使用线程池能够带来3个好处。降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消…

(1分钟了解)SLAM的七大问题:地图表示、信息感知、数据关联、定位与构图、回环检测、深度、绑架

编辑切换为居中添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;SLAM问题也被称为是CML问题。编辑切换为居中添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;编辑切换为居中添加图片注释&#xff0c;不超过 140 字&#xff08;可选&…

(JMLR-2019)NAS综述鼻祖-神经架构搜索:一项调查

神经架构搜索&#xff1a;一项调查 paper题目&#xff1a;Neural Architecture Search: A Survey paper是博世人工智能中心发表在JMLR 2019的工作 paper链接&#xff1a;地址 Abstract 过去几年&#xff0c;深度学习在图像识别、语音识别和机器翻译等各种任务上取得了显着进步…

【C++】stl---vector的模拟实现(超级详细,万字详解)

文章目录前言vector的成员属性构造函数size函数cacpcity函数begin和end函数reserve函数insert函数push_back函数[]操作符重载析构函数拷贝构造函数赋值操作符重载erase函数pop_back反向迭代器反向迭代器模板反向迭代器的构造函数运算符重载- -运算符重载*引用操作符重载&#x…

Spring AOP 企业级应用 - 统一功能处理

1.统一用户登录权限效验统一用户登录权限效验使用传统的 AOP 能否解决问题呢 ? Component Aspect // 标识当前类为一个切面 public class LoginAOP {// 定义切点 (拦截的规则) - 拦截 UserController 中的所有方法Pointcut("execution(* com.example.demo.controller.Tes…

React Hooks 基础、实现、原理

React Hooks 基础、实现、原理题外话为什么要有Hooks&#xff1f;但是Class Component 的用法也有缺陷&#xff1a;1.组件复用变的困难2.JavaScript本身的缺陷函数式React HooksuseStateuseEffectuseCallback、useMemouseReducer最后题外话 2023了&#xff0c;新年快乐&#x…

【javascript】DOM 案例

点击查看密码 &#xff1a;就是把type等于password改为text即可&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><…

电力系统强大的Gurobi 求解器的学习(PythonMatlab)

到底有多强大&#xff0c;看看就知道&#xff0c;必须&#x1f44d;&#x1f44d;&#x1f44d;&#xff1a; 目录 1 概述 2 算例理解【Python】 2.1 算例1——详细入门 2.2 算例2——一般线性规划问题 2.3 算例3——非凸问题 3 算例升级【Matlab】 3.1 模型 3.2 电力系统…