Windows 11 VS Code C/C++ 开发环境搭建——一种尽量“绿色”的方法

我的电脑是Windows 11 系统,安装了Visual Studio Code,在上面搭建C/C++开发环境,当然,这需要用到MinGW之流了。作为一个绿色爱好者(帽子除外),我也尽量绿色地架设这样一个环境……

第一步:获取绿色免安装版的 MinGW-w64

MinGW-w64 是 MinGW 项目的一个分支,提供了更现代、更完整的 Windows API 支持,并且同时支持 32 位和 64 位开发。推荐使用它。

  1. 选择来源: 有几个地方可以下载预编译好的、免安装的 MinGW-w64 包。一个非常流行的、维护良好的来源是 winlibs.com。它直接提供 ZIP 压缩包,非常适合绿色版的需求。
    • 访问 https://winlibs.com/
  2. 选择版本:
    • 架构(Architecture): 选择 x86_64 (适用于 64 位 Windows 开发,现在是主流)。
    • 线程模型(Thread model): 选择 posix (通常兼容性更好)。
    • 异常处理(Exception handling): 对于 64 位,选择 seh (性能较好)。
    • 构建类型(Build type): 通常选择最新的稳定版 GCC。你可以选择 Win64 下的 GCC + MinGW-w64 版本(UCRT 或 MSVCRT runtime)。UCRT 是较新的运行时,更接近 Windows 10/11 的标准 C 运行时,推荐使用。
    • 下载格式: 选择 .zip 压缩包格式(例如 without LLVM/Clang/LLD/LLDB 的那个,如果你只需要 GCC 工具链)。
  3. 解压 MinGW-w64:
    • 下载完成后,将 .zip 文件解压到一个你选择的、路径不含中文或空格的位置。例如:
      • C:\mingw64
      • D:\tools\mingw64
      • 避免放在 C:\Program Files 或其他需要管理员权限的目录,也尽量避免放在路径过深的目录。
    • 解压后,我们能看到一个类似 mingw64 的文件夹,里面包含 bin, include, lib, libexec 等子目录。核心的编译器 (gcc.exe, g++.exe) 和调试器 (gdb.exe) 都在 bin 目录下。
      MinGW目录

第二步:配置环境变量 (推荐 VS Code 内配置,而非系统全局配置)

为了实现真正的“绿色”和环境隔离,最佳实践不是修改系统的 PATH 环境变量,而是在 VS Code 的工作区设置中直接指定编译器路径。这样不同的项目可以使用不同版本的编译器,且不会影响系统其他部分。我们将在后面的 VS Code 配置步骤中完成这一步。

  • (可选,但不推荐用于纯绿色环境)修改系统 PATH: 如果你确实希望在任何命令行窗口都能直接使用 gccg++ 命令,可以手动将 MinGW-w64 的 bin 目录添加到系统的 PATH 环境变量中。
    1. 右键点击“此电脑” -> “属性”。
    2. 点击“高级系统设置”。
    3. 点击“环境变量”。
    4. 在“系统变量”或“用户变量”中找到 Path 变量,点击“编辑”。
    5. 点击“新建”,然后输入你解压的 MinGW-w64 bin 目录的完整路径(例如 C:\mingw64\bin)。
    6. 一路确定保存。需要重启 VS Code 或命令行窗口才能生效。
    • 再次强调: 对于保持环境纯净和项目独立性,更推荐下面(第四步)的 VS Code 配置方法。

第三步:安装 VS Code 和 C/C++ 扩展

  1. 确保你已经安装了 Visual Studio Code。
  2. 打开 VS Code。
  3. 转到“扩展”视图(侧边栏图标,或按 Ctrl+Shift+X)。
  4. 搜索 C/C++
  5. 找到由 Microsoft 发布的 C/C++ 扩展(通常是第一个结果),点击“安装”。

第四步:创建和配置项目

  1. 创建项目文件夹: 在你喜欢的位置创建一个新的文件夹作为你的 C/C++ 项目目录,例如 D:\projects\HelloWorld

  2. 用 VS Code 打开文件夹: 在 VS Code 中,选择“文件”->“打开文件夹”,然后选择你刚创建的项目文件夹。

  3. 创建源文件: 在 VS Code 的文件浏览器中,右键点击空白处 -> “新建文件”,命名为 hello.cpp (或者 hello.c 如果你写 C 代码)。

  4. 编写示例代码:

    // hello.cpp
    #include <iostream>
    #include <vector>
    #include <string>int main() {std::vector<std::string> msg {"Hello", "C++", "World", "from", "VS Code", "and", "MinGW-w64!"};for (const std::string& word : msg) {std::cout << word << " ";}std::cout << std::endl;std::cout << "GCC version: " << __VERSION__ << std::endl; // 输出 GCC 版本return 0;
    }
    

    或者 C 语言版本 (hello.c):

    // hello.c
    #include <stdio.h>int main() {printf("Hello, C World from VS Code and MinGW-w64!\n");printf("GCC version: %s\n", __VERSION__); // 输出 GCC 版本return 0;
    }
    
  5. 配置 VS Code 工作区设置: 这是关键步骤,让 VS Code 知道你的编译器在哪里,以及如何构建和调试。

    • Ctrl+Shift+P 打开命令面板,输入 C/C++: Edit Configurations (UI) 并回车。
    • 这会在项目文件夹下创建一个 .vscode 子目录,并在其中生成 c_cpp_properties.json 文件。
    • 在打开的 UI 界面或直接编辑 c_cpp_properties.json 文件,进行以下关键配置:
      • 编译器路径 (Compiler path): 这是最重要的设置。点击下拉菜单,如果 VS Code 没有自动检测到你的 MinGW-w64 (因为它不在系统 PATH 里),你需要手动指定。选择“输入路径…”或直接编辑 JSON 文件,将其设置为你的 g++.exe (用于 C++) 或 gcc.exe (用于 C) 的完整路径。例如:
        // 对于 C++
        "compilerPath": "C:/mingw64/bin/g++.exe", // 注意:路径分隔符用正斜杠 '/'
        // 对于 C
        // "compilerPath": "C:/mingw64/bin/gcc.exe",
        
      • IntelliSense 模式 (IntelliSense mode): 根据你的编译器和目标平台选择。对于 MinGW-w64 64位,通常选择 windows-gcc-x64。VS Code 通常会根据 compilerPath 自动推断。
      • 包含路径 (Include path): 通常 ${workspaceFolder}/** 就足够了。如果你的项目依赖外部库,需要在这里添加库的 include 目录。对于标准库,编译器会自动查找,通常不需要手动添加 MinGW-w64 的 include 目录,除非 IntelliSense 遇到问题。
      • C 标准 / C++ 标准 (C Standard / C++ Standard): 选择你希望使用的 C 或 C++ 标准,例如 c17c++17, c++20

    最终的 c_cpp_properties.json 文件可能看起来像这样:

    {"configurations": [{"name": "Win32", // 这个名字可以自定义"includePath": ["${workspaceFolder}/**"// 如果需要,可以添加 MinGW 的 include 路径,但通常编译器路径设置好后就够了// "C:/mingw64/include/**",// "C:/mingw64/lib/gcc/x86_64-w64-mingw32/13.2.0/include/**" // 替换成你的实际版本号],"defines": ["_DEBUG","UNICODE","_UNICODE"],"compilerPath": "D:/tools/mingw64/bin/g++.exe", // 确保这是你 g++.exe 的正确路径"cStandard": "c17","cppStandard": "c++17", // 或 c++20 等"intelliSenseMode": "windows-gcc-x64"}],"version": 4
    }
    
  6. 配置构建任务 (tasks.json):

    • Ctrl+Shift+P,输入 Tasks: Configure Default Build Task 并回车。
    • 选择 C/C++: g++.exe build active file (或 gcc.exe 如果用 C)。
    • 这会在 .vscode 目录下创建 tasks.json 文件。
    • 检查生成的 tasks.json 文件。确保 command 指向了正确的编译器路径(通常它会从 c_cpp_properties.json 推断,但检查一下没坏处)。可以添加 -g 参数以包含调试信息,并用 -Wall -Wextra 打开更多警告。

    一个示例 tasks.json

    {"version": "2.0.0","tasks": [{"type": "cppbuild", // 或 "shell""label": "C/C++: g++.exe build active file", // 任务标签,可以自定义"command": "C:/mingw64/bin/g++.exe", // 确认编译器路径"args": ["-fdiagnostics-color=always", // 彩色输出错误信息"-g",                       // 生成调试信息"${file}",                  // 当前活动文件"-o",                       // 输出文件选项"${fileDirname}\\${fileBasenameNoExtension}.exe" // 输出的可执行文件路径和名称// 可以添加更多编译选项,如:// "-Wall",                 // 打开常用警告// "-Wextra",               // 打开额外警告// "-std=c++17"             // 明确指定 C++ 标准],"options": {"cwd": "${fileDirname}" // 设置工作目录为文件所在目录},"problemMatcher": ["$gcc" // 使用 GCC 的问题匹配器,高亮错误和警告],"group": {"kind": "build","isDefault": true // 设置为默认构建任务 (按 Ctrl+Shift+B 触发)},"detail": "compiler: C:/mingw64/bin/g++.exe" // 任务描述}]
    }
    
  7. 配置调试器 (launch.json):

    • 切换到“运行和调试”视图(侧边栏带虫子的播放按钮图标,或按 Ctrl+Shift+D)。
    • 点击“创建 launch.json 文件”。
    • 在弹出的选择环境菜单中,选择 C++ (GDB/LLDB)
    • 然后选择 g++.exe build and debug active file (或者类似,它会尝试自动生成)。
    • 这会在 .vscode 目录下创建 launch.json 文件。
    • 关键配置:
      • program: 确保它指向由构建任务生成的可执行文件的路径,通常是 "${fileDirname}\\${fileBasenameNoExtension}.exe"
      • miDebuggerPath: 非常重要,将其设置为你的 MinGW-w64 bin 目录下的 gdb.exe完整路径。例如:"miDebuggerPath": "C:/mingw64/bin/gdb.exe"
      • preLaunchTask: 确保它设置为你在 tasks.json 中定义的构建任务的 label,这样每次调试前都会自动重新编译。例如 "preLaunchTask": "C/C++: g++.exe build active file"

    一个示例 launch.json

    {"version": "0.2.0","configurations": [{"name": "(gdb) Launch", // 配置名称,可以自定义"type": "cppdbg","request": "launch","program": "${fileDirname}\\${fileBasenameNoExtension}.exe", // 要调试的程序"args": [], // 传递给程序的命令行参数"stopAtEntry": false, // 是否在 main 函数入口处暂停"cwd": "${fileDirname}", // 设置工作目录"environment": [],"externalConsole": true, // 是否使用外部控制台窗口显示程序输出 (推荐 true)"MIMode": "gdb","miDebuggerPath": "D:/tools/mingw64/bin/gdb.exe", // GDB 调试器路径,务必正确"setupCommands": [{"description": "Enable pretty-printing for gdb","text": "-enable-pretty-printing","ignoreFailures": true},{"description": "Set Disassembly Flavor to Intel","text": "-gdb-set disassembly-flavor intel","ignoreFailures": true}],"preLaunchTask": "C/C++: g++.exe build active file" // 调试前运行的构建任务标签}]
    }
    

第五步:构建、运行和调试

  1. 构建 (编译):
    • 确保你的源文件 (hello.cpphello.c) 是当前活动文件。
    • Ctrl+Shift+B (或者通过菜单“终端”->“运行生成任务…”) 来执行默认的构建任务。
    • 查看 VS Code 下方的“终端”面板,应该会显示编译过程。如果没有错误,你会在源文件同目录下看到生成的可执行文件 (hello.exe)。
  2. 运行 (不调试):
    • Ctrl+F5 (或者通过菜单“运行”->“启动执行(不调试)”)。
    • 如果 externalConsole 设置为 true,会弹出一个新的命令行窗口显示程序输出。如果为 false,输出会显示在 VS Code 的“调试控制台”面板。
  3. 调试:
    • 在代码中设置断点:在行号左侧单击即可。
    • F5 (或者通过菜单“运行”->“启动调试”)。
    • 程序会在第一个断点处暂停。你可以使用调试工具栏(通常在 VS Code 顶部)进行单步执行 (F10, F11)、查看变量、查看调用堆栈等操作。

总结:

  1. 使用 MinGW-w64 (UCRT 版本优先): 提供更好的 Windows API 支持和 C++ 标准支持。
  2. 保持 MinGW-w64 绿色免安装: 将其解压到独立、路径简单的文件夹,不要运行安装程序(如果你下载的是安装版)。
  3. 优先使用 VS Code 工作区配置 (.vscode 文件夹):c_cpp_properties.json, tasks.json, launch.json 中直接指定编译器和调试器路径,而不是修改全局系统 PATH。这使得项目环境自包含、易于管理和分享,且不影响系统。
  4. 使用 .vscode 文件夹管理配置: 将构建和调试配置与项目代码放在一起。
  5. 启用编译器警告:tasks.json 的编译参数中加入 -Wall -Wextra,帮助发现潜在问题。
  6. 编译时包含调试信息: 使用 -g 参数,这样 GDB 才能有效地进行源码级调试。
  7. 使用版本控制: 使用 Git 等工具管理你的代码和 .vscode 配置文件。
  8. 对于大型项目,考虑使用构建系统: CMake 或 Meson 是跨平台的现代 C++ 构建系统,可以更方便地管理复杂的项目依赖和编译过程。VS Code 有很好的 CMake Tools 扩展。
  9. 保持工具链更新: 定期检查 winlibs.com 或其他来源,更新你的 MinGW-w64 到较新版本以获得 bug 修复和新特性。由于是绿色版,更新通常只需要下载新版 ZIP 包,解压替换旧的即可(注意更新 .vscode 配置文件中的路径或版本号,如果需要)。

遵循这些步骤和实践,我算是在 Windows 11 上搭建了一个干净、强大且易于管理的 C/C++ 开发环境。当然后续还有各种问题,我将在后续的文章中分享。

运行效果

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

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

相关文章

mysql-分区和性能

mysql自身只支持表的横向分区。 常听到开发人员说“”对表做个分区“&#xff0c;然后数据的查询就会快了。这是真的吗&#xff1f;实际上可能跟根本感觉不到查询速度的提升&#xff0c;甚至会发现查询速度急剧下降。因此&#xff0c;在合理使用分区之前&#xff0c;必须了解分…

DeepSeek协助优化-GTX750Ti文物显卡0.65秒卷完400MB float 音频512阶时域FIR

文章目录 1. 学习目的2. 阶段成果2.1 NVVP 性能探查2.2 测试编译环境2.3 测试样例 3 学习过程3.1 提问DeepSeek3.2 最终代码 4. 体会 1. 学习目的 最近在学习cuda&#xff0c;准备给我的taskBus SDR添加CUDA的模块支持&#xff0c;以便可以用PC机压榨山寨 B210那56M的带宽。 因…

RabbitMQ高级特性--TTL和死信队列

目录 1.TTL 1.1设置消息的TTL 1.1.1配置交换机&队列 1.1.2发送消息 1.1.3运行程序观察结果 1.2设置队列的TTL 1.2.1配置队列和交换机的绑定关系 1.2.2发送消息 1.2.3运行程序观察结果 1.3两者区别 2.死信队列 2.1 声名队列和交换机 2.2正常队列绑定死信交换机 …

【JavaEE】UDP数据报套接字编程

目录 网络编程基础 基本概念 发送端和接收端 请求和响应 客户端和服务端 常见的客户端服务端模型 Socket套接字 TCP/UDP特点 Java数据报套接字通信模型(UDP通信) UDP数据报套接字编程 DatagramSocket 1.类定义 2.构造方法 3.核心方法 4.特性说明 DatagramPacke…

Spring Boot 3.4.3 基于 SpringDoc 2 和 Swagger 3 实现项目接口文档管理

在现代企业级应用开发中&#xff0c;前后端分离已成为主流模式&#xff0c;前端负责界面呈现&#xff0c;后端专注提供 RESTful API 接口。然而&#xff0c;接口文档的编写和维护往往是开发过程中的痛点。Spring Boot 3.4.3 结合 SpringDoc 2 和 Swagger 3&#xff0c;为开发者…

构建大语言模型应用:数据准备(第二部分)

本专栏通过检索增强生成&#xff08;RAG&#xff09;应用的视角来学习大语言模型&#xff08;LLM&#xff09;。 本系列文章 简介数据准备&#xff08;本文&#xff09;句子转换器向量数据库搜索与检索大语言模型开源检索增强生成评估大语言模型服务高级检索增强生成 RAG 如上…

Linux 随机数据生成

目录 一. /dev/urandom1.1 dd 命令1.2 head命令1.3 随机字母 二. openssl 命令三. yes命令 一. /dev/urandom ⏹/dev/urandom 是 Linux 和 Unix 系统中的一个特殊文件&#xff0c;它是一个伪随机数生成器&#xff0c;用于提供高吞吐量的随机数据。 1.1 dd 命令 bs1M count10…

项目如何安装本地tgz包并配置局部registry

一、判断包来源是否正确 1. 检查url curl <registry_url>2. 查看包是否存在 npm view <package_name> --registry<registry_url>二、局部registry配置步骤&#xff1a; 1. 全局配置 如果你希望对所有项目生效&#xff0c;可以将这行配置添加到全局.npmr…

QCustomPlot入门

QCustomPlot 是一个基于 Qt 的 C++ 绘图库,专注于高效、美观的 2D 数据可视化。进入QCustomPlot下载页,下载最新的完整包(包含:源码、文档、示例)。 一、核心架构设计 1. 分层架构模型 层级主要组件职责说明用户接口层QCustomPlot 类提供顶层API,管理所有子组件逻辑控制…

C语言快速入门-C语言基础知识

这个c语言入门&#xff0c;目标人群是有代码基础的&#xff0c;例如你之前学过javaSE&#xff0c;看此文章可能是更有帮助&#xff0c;会让你快速掌握他们之间的差异&#xff0c;文章内容大部分都是泛谈&#xff0c;详细的部分我会在之后时间发布&#xff0c;我也在慢慢学习&am…

【商城实战(91)】安全审计与日志管理:为电商平台筑牢安全防线

【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配,乃至运营推广策略,102 章内容层层递进。无论是想…

信息安全工程师第 1 章

《信息安全工程师教程(第2版)》第一章 一、网络信息安全基本概念与重要性 网络信息安全定义 狭义:保障信息系统的机密性(C)、完整性(I)、可用性(A)——CIA三性。广义:涵盖国家安全、经济安全、社会安全等的“大安全”。法律依据:《网络安全法》定义网络安全为防范攻…

为什么视频文件需要压缩?怎样压缩视频体积即小又清晰?

在日常生活中&#xff0c;无论是为了节省存储空间、便于分享还是提升上传速度&#xff0c;我们常常会遇到需要压缩视频的情况。本文将介绍为什么视频需要压缩&#xff0c;压缩视频的好处与坏处&#xff0c;并教你如何使用简鹿视频格式转换器轻松完成MP4视频文件的压缩。 为什么…

网络空间安全(45)PHP入门学习

一、PHP文件与结构 PHP文件扩展名&#xff1a;PHP文件通常以.php作为扩展名&#xff0c;例如index.php。 PHP代码嵌入&#xff1a;PHP代码可以嵌入到HTML文件中&#xff0c;通常使用<?php ... ?>标签包围PHP代码。短标签<? ... ?>在某些配置下也可以使用&…

深入 OpenPDF:高级 PDF 生成与操作技巧

1 引言 1.1 项目背景 在许多企业级应用中,生成和操作 PDF 文档是一个常见的需求。PDF(Portable Document Format)因其格式统一、易于打印和分发而被广泛使用。本文将介绍如何使用 OpenPDF 库在 Java 项目中生成和操作 PDF 文档。 1.2 技术选型理由 OpenPDF:OpenPDF 是一…

力扣hot100——最长连续序列(哈希unordered_set)

题目链接&#xff1a;最长连续序列 1、错解&#xff1a;数组做哈希表&#xff08;内存超出限制&#xff09; int longestConsecutive(vector<int>& nums) {vector<bool> hash(20000000010, false);for(int i0; i<nums.size();i){hash[1000000000nums[i]]t…

Qt中信号带参传值

在我们的Qt信号中是可以进行参数的传递的&#xff0c;不过格式上与写普通函数不同。 这是头文件中定义一个含参信号和一个含参槽函数 我们再来看它们两个的绑定 。第一行的clicked()和on_btn_clicked()就是普通无参信号和槽的绑定&#xff1b;第二行就是上图中两个带参信号和槽…

CSS3学习教程,从入门到精通, CSS3 列表控制详解语法知识点及案例代码(24)

CSS3 列表控制详解 CSS 列表控制的语法知识点及案例代码的详细说明&#xff0c;包括 list-style-type、list-style-image、list-style-position 和 list-style 的用法。 1. list-style-type 属性 list-style-type 属性用于设置列表项标记的类型。 语法 list-style-type: v…

用Deepseek写扫雷uniapp小游戏

扫雷作为Windows系统自带的经典小游戏&#xff0c;承载了许多人的童年回忆。本文将详细介绍如何使用Uniapp框架从零开始实现一个完整的扫雷游戏&#xff0c;包含核心算法、交互设计和状态管理。无论你是Uniapp初学者还是有一定经验的开发者&#xff0c;都能从本文中获得启发。 …

Dust3r、Mast3r、Fast3r

目录 一.Dust3r 1.简述 2.PointMap与ConfidenceMap 3.模型结构 4.损失函数 5.全局对齐 二.Mast3r 1.简述 2.MASt3R matching 3.MASt3R sfm 匹配与标准点图 BA优化 三.Fast3r 1.简述 2.模型结构 3.损失函数 三维重建是计算机视觉中的一个高层任务&#xff0c;包…