<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh_CN">
  <title>丝瓜研究所</title>
  <subtitle>小丝瓜のBlog</subtitle>
  <link href="https://xsgovo.github.io/" rel="alternate" type="text/html"/>
  <link href="https://xsgovo.github.io/atom.xml" rel="self" type="application/atom+xml"/>
  <id>https://xsgovo.github.io/</id>
  <updated>2026-04-09T00:00:00.000Z</updated>
  <entry>
    <title>Windows 配置 Python 环境——从安装到项目管理</title>
    <link href="https://xsgovo.github.io/posts/%E5%9C%A8windows%E4%B8%AD%E4%BC%98%E9%9B%85%E7%AE%A1%E7%90%86python%E7%8E%AF%E5%A2%83/" rel="alternate" type="text/html"/>
    <id>https://xsgovo.github.io/posts/%E5%9C%A8windows%E4%B8%AD%E4%BC%98%E9%9B%85%E7%AE%A1%E7%90%86python%E7%8E%AF%E5%A2%83/</id>
    <published>2026-04-09T00:00:00.000Z</published>
    <updated>2026-04-09T00:00:00.000Z</updated>
    <summary>在 Windows 上从零开始配置 Python 开发环境，包括 Python 安装、虚拟环境管理、包管理工具选择与项目工程化实践。</summary>
    <content type="text">[!WARNING]
AI 生成内容声明：
本文内容由人工智能辅助生成，经过人工审阅与校对完成。

---

由于 Python 早期的工程结构非常的放飞自我，官方的 Python 体系在早期就是一个烂摊子，于是就有了各式各样的第三方工具。

这篇文章，就是教你如何使用这些工具快速初始化你的项目。

---
先搞清楚你要什么

Python 环境管理工具可以分成两大派系：
第一派：PyPI 生态

代表工具：pip、venv、uv、poetry、pdm
pip: Python 官方包管理器，最基础
uv: 用 Rust 重写，速度极快，目前最推荐
poetry: 功能全面，适合库开发
pdm: 类似 poetry，但更符合 PEP 标准

特点：只管理 Python 包，从 PyPI 下载。轻量、现代、速度快。

适合：Web 开发、自动化脚本、工具类项目、库开发。
第二派：Conda 生态

代表工具：Miniconda、Miniforge、mamba、pixi
conda: 跨语言包管理器，能管 Python + 系统级库
miniforge: 社区版 conda，免费，内置 mamba
mamba: 用 C++ 重写的 conda，速度快
pixi: 用 Rust 写的 conda 包管理器，类似 uv 的体验

特点：conda 从根本上与官方 Python 走的不是一条路，拥有自己的配置文件、软件仓库，甚至连 Python 解释器都是自己编译的。支持 Go、Rust、C++、R 等多种语言，本质上是一个跨语言的独立开发平台，解决深度学习的环境地狱。

适合：数据分析、机器学习、深度学习。
核心原则

不要把任何 Python 添加到系统环境变量。

这是血泪教训。一旦 PATH 里有多个 Python，各种工具会互相打架，排查问题能浪费你一整天。

正确的做法：
PyPI 派：用 uv 管理 Python 版本，通过 uv run 调用
Conda 派：用 conda 创建隔离环境，通过 conda activate 切换

我见过有人在 conda 环境里用 pip 装包，装完发现 CUDA 版本对不上，PyTorch 直接罢工。排查了三个小时，最后重装整个环境。

所以先问自己：我要不要碰深度学习？

不碰，走 PyPI 派。要碰，走 Conda 派。

---
准备工作：安装 PyCharm

写 Python 代码需要一个趁手的编辑器。推荐使用 PyCharm：

官方下载地址： https://www.jetbrains.com/zh-cn/pycharm/

PyCharm 是 JetBrains 开发的 Python 专用 IDE，分两个版本：
Community（社区版）：免费，功能足够日常使用
Professional（专业版）：付费，支持 Web 开发、Django 等高级功能

现在社区版和专业版整合到一起了，直接下载就行。

---
方案一：PyPI 派（uv 管理，推荐）

这是目前最轻量、最现代的选择。不需要下载官方 Python 安装包，一切交给 uv。
第一步：安装 uv

uv 是一个用 Rust 写的 Python 项目管理工具，速度比 pip 快 10 到 100 倍。

使用 PowerShell 一键安装：

这个命令会安装到 C:\Users\你的用户名\.local\bin，装完验证：
第二步：用 uv 安装 Python

uv 可以自动下载并管理 Python 版本，不需要去 python.org 下载安装包。

安装最新版 Python：

安装指定版本：

查看已安装的版本：

Python 会被安装到 uv 的管理目录（如 %APPDATA%\uv\python）中。
第三步：创建你的第一个项目

找个干净的文件夹，执行：

uv 会自动：
下载最新的 Python（如果还没装）
生成 pyproject.toml 配置文件
创建 .venv 虚拟环境

生成的 pyproject.toml 长这样：

requires-python 声明了项目需要的 Python 版本，dependencies 是项目依赖的包。
第四步：安装依赖

假设你要用 requests 写个爬虫：

这条命令背后发生了什么？
解析依赖：uv 去 PyPI 查询 requests 的最新版本，以及它依赖的其他包
写入配置：把 requests = &quot;^2.31.0&quot; 写进 pyproject.toml
生成锁文件：创建 uv.lock，精确记录所有依赖的具体版本号和哈希值
安装包：把 requests 和所有依赖装进 .venv

整个过程几秒钟完成。
第五步：在 PyCharm 中打开项目

命令行把项目建好之后，用 PyCharm 打开它：
打开 PyCharm，选择 打开，选中刚才 uv init 创建的项目目录
进入 设置 → Python → 解释器
点击右上角 添加解释器 → 添加本地解释器
左侧选 生成新的，类型选选 uv

PyCharm 识别到 .venv 之后，编辑器的自动补全、跳转定义、类型推断全部生效。
后续用 uv add 安装新包时，PyCharm 会自动检测到 .venv 的变化并刷新索引，不需要手动操作。

或者用 PyCharm 直接创建：
打开 PyCharm，选择新建项目。
在解释器类型一栏选择需要的解释器，PyCharm 现在默认支持 venv、uv 和 conda 解释器。
通常情况下 PyCharm 会自动检测到这些工具的路径，如果没有，请手动添加。下次新建项目 PyCharm 就会记住这些路径。
点击创建就行了。
第六步：运行代码

如果你使用 PyCharm，直接点击顶部的运行按钮就可以了。

或者使用 uv run 运行代码，它会自动找到对应的环境：

uv run 的工作原理

uv run 会：
检查当前目录有没有 .venv
临时把 .venv\Scripts 加到 PATH 最前面
在这个环境下执行命令
命令结束后恢复原 PATH

所以你不需要手动 activate，也不用担心忘记 deactivate 导致全局环境被污染。
验证安装

确认环境是否正常工作：

如果能看到 Python 版本号和已安装的包列表，说明一切正常。
常用命令速查
换源

PyPI 官方源服务器在国外，国内访问经常慢。配置清华镜像：

或者临时用：

常用国内镜像：
清华：https://pypi.tuna.tsinghua.edu.cn/simple
阿里云：https://mirrors.aliyun.com/pypi/simple/
豆瓣：https://pypi.doubanio.com/simple/

---
方案二：Conda 派（深度学习专用）

如果你要装 PyTorch、TensorFlow，或者任何依赖 CUDA 的库，用 Conda 派。
为什么深度学习必须用 Conda？

深度学习框架底层依赖大量 C/C++/CUDA 编写的库：
CUDA：NVIDIA 的并行计算平台
cuDNN：深度神经网络加速库
MKL：Intel 数学核心库

这些不是 Python 包，是系统级的二进制库。pip 只能管 Python 包，管不了这些。

Conda 的优势在于：
跨语言包管理：能安装 Python 包 + 系统级库
预编译二进制：Windows 上编译 CUDA 库非常麻烦，conda 直接提供编译好的版本
版本协调：PyTorch 需要 CUDA 11.8 还是 12.1？conda 会帮你算清楚
选择哪个工具？

| 工具 | 特点 | 推荐度 |
|------|------|--------|
| Anaconda | 全家桶，3GB+，商业收费 | ⭐ 不推荐 |
| Miniconda | 精简版，只含 conda | ⭐⭐ 可用 |
| Miniforge | 社区版，免费，内置 mamba | ⭐⭐⭐⭐⭐ 最推荐 |
| pixi | Rust 写的，类似 uv 的体验，IDE 支持有限 | ⭐⭐⭐⭐ 新兴 |

为什么选 Miniforge？
Anaconda 的默认频道 2020 年起对商业用途收费
Miniforge 默认用 conda-forge，完全免费
Miniforge 内置 Mamba，安装速度快 4-5 倍
安装 Miniforge

官方下载地址： https://conda-forge.org/miniforge/

Windows 用户找 Miniforge3-Windows-x8664.exe 下载。
警告：不要将 Miniforge 安装到权限受限的文件夹中，比如 Program Files。

安装步骤：
运行安装包
安装路径建议选纯英文，比如 D:\miniforge3
默认取消勾选 &quot;Add Miniforge3 to my PATH environment variable&quot;
完成安装

由于 Miniforge3 添加环境变量是通过修改注册表实现的，所以不建议添加到环境变量。

既然没有添加到环境变量，你需要通过完整路径调用 conda。一般路径 D:\miniforge3\Scripts\conda.exe。

不过也不用担心，安装完成后你的电脑会出现一个 Miniforge Prompt 的程序，打开它就可以使用 conda 了。
配置镜像

打开 Miniforge Prompt，在出现的终端前有类似括号代表当前的环境：

conda 默认源在国外，国内访问慢。配置清华镜像：
创建环境

每个项目一个环境，不要往 base 里装东西：

切换到创建的环境：

当看见终端前变成 (myenv) 时就代表切换成功了。

为什么不要往 base 装？

base 是 conda 自己的运行环境。如果你在 base 里乱装包，可能破坏 conda 本身的依赖，导致 conda 命令都跑不起来。

养成习惯：每个项目 conda create -n 环境名，隔离干净。

删除环境：

先退出到 base 环境。

为了防止误删，建议先查看一下现有的环境列表，确认你要删除的环境名称拼写无误：

删除指定的环境：
安装依赖

在激活的环境中安装 Python 包：

如果 conda 找不到某个包，再用 pip 安装：
安装深度学习框架

以 PyTorch 为例：

这条命令拆解
pytorch torchvision torchaudio：PyTorch 核心包 + 视觉/音频工具包
pytorch-cuda=12.1：指定 CUDA 12.1 版本
-c pytorch：从 pytorch 频道下载
-c nvidia：从 nvidia 频道下载 CUDA 相关库

conda 会自动计算依赖关系，确保 PyTorch、CUDA、cuDNN 版本兼容。

如果用 pip 装 PyTorch，你得自己去 NVIDIA 官网下载 CUDA，配置环境变量，确保版本匹配。一步错，PyTorch 就检测不到 GPU。
一个原则

在 conda 环境里，优先用 conda install，找不到的包再用 pip install。顺序反了容易把环境搞乱。

为什么顺序重要？

conda 和 pip 的依赖解析器不一样。conda 装包时会考虑整个环境的依赖图，pip 只考虑 Python 包。

如果你先用 pip 装了某个包，再用 conda 装其他包，conda 可能不知道 pip 装的包的存在，导致依赖冲突。

正确顺序：
conda install 装所有能装的（尤其是 CUDA 相关的）
pip install 补 conda 找不到的包
在 PyCharm 中使用 Conda 环境

环境建好之后，把 PyCharm 指向它：
打开 PyCharm，选择 打开，选中刚才 uv init 创建的项目目录
进入 设置 → Python → 解释器
点击右上角 添加解释器 → 添加本地解释器
右侧选 选择现有，类型选选 conda
点击右侧下拉框，PyCharm 通常能自动列出已有的 conda 环境。

配置完成后，PyCharm 会索引这个环境里的所有包，自动补全和类型推断随即生效。

或者用 PyCharm 直接创建：
打开 Pycharm，点击新建项目
在解释器类型一栏选择需要的解释器，选择 Conda 解释器。
通常情况下 PyCharm 会自动检测到这些工具的路径，如果没有，请手动添加。下次新建项目 PyCharm 就会记住这些路径。
点击创建就行了。
验证安装

确认环境是否正常工作：

如果安装了 PyTorch，可以验证 GPU 是否可用：

输出 True 表示 GPU 可以被 PyTorch 调用。
将 Conda 的项目分享给他人

首先激活你创建的 conda 环境：

使用 conda env export 命令导出配置：

导出的文件会出现在当前目录。

对方拿到 environment.yml 文件后，在自己的终端执行以下命令即可创建并激活环境：
常用命令速查

常见问题
PowerShell 执行脚本报错

如果遇到：

解决：

只需要执行一次。
中文路径问题

Python 和很多第三方库对中文路径支持不好。建议：
安装路径用纯英文，如 D:\miniforge3 而不是 D:\软件\miniforge3
项目路径也别用中文

为什么中文路径会出问题？

Windows 默认用 GBK 编码，而 Python 3 默认用 UTF-8。路径里有中文时，编码不一致可能导致文件打不开、导入模块失败、编译 C 扩展时报错。

最简单的解决方案：统一用英文路径。
多个 Python 版本共存

用 uv：

uv 会自动下载并管理多个 Python 版本，每个项目可以指定用哪个版本。

用 conda：

conda 通过不同环境隔离不同 Python 版本，切换环境就是切换 Python 版本。
uv 命令找不到

如果安装 uv 后提示命令不存在，说明 PATH 没有配置好。

解决方法：
找到 uv 的安装位置（通常是 C:\Users\你的用户名\.local\bin）
手动添加到 PATH：
Win + S 搜索&quot;环境变量&quot;
编辑用户变量的 Path
添加 C:\Users\你的用户名\.local\bin
重启 PowerShell

或者直接用完整路径调用：

---
附录 A：更新和卸载
更新 uv

如果你是通过脚本安装的话，你可以升级 uv：
卸载 uv

清理存储的数据（可选）：

删除 uv 和 uvx 二进制文件：
更新 Miniforge

一般不推荐直接更新 Miniforge 本体，如果你一定要更新，请卸载并从官网重新下载安装最新版本的 Miniforge。
卸载 Miniforge

没什么好说的，直接在 Windows 应用管理直接卸载就可以了。

---
附录 B：运行别人的旧项目
场景一：有 requirements.txt

requirements.txt 是一种早期的分享虚拟环境的方法，使用 pip freeze 就可以将安装的包导出：

如果需要安装：

让 pip 自动找兼容版本：
场景二：有 pyproject.toml

目前 Python 官方指定了 pyproject.toml 作为统一的项目配置文件。

uv 项目：

poetry 项目：

pdm 项目：
场景三：什么都没有

没招，只能自己一个个找了。

---
附录 C：其他工具速览
poetry

功能全面的 Python 包管理工具，适合库开发。
pdm

类似 poetry，但更符合 PEP 标准。
pixi

用 Rust 写的 conda 包管理器，结合 conda 能力和 uv 体验。

这里稍微介绍一下 pixi，pixi 通过在项目当前目录创建了一个 .pixi 文件夹用来存放所有环境依赖，但是它是由 pixi.toml 来统一管理的，和 Python 的 pyproject.toml 并不完全兼容。

官网：https://pixi.prefix.dev/latest/

安装 pixi：

更新 pixi：

常用命令：

pixi 相对较新，社区生态还在成长中。

---
选择建议

| 场景 | 推荐方案 | 理由 |
|------|----------|------|
| Web 开发 / 自动化脚本 / 工具类项目 | uv | 轻量、现代、速度极快 |
| 库开发 / 要发布到 PyPI | uv 或 poetry | 支持构建和发布 |
| 数据分析 / 机器学习 / 深度学习 | Miniforge | 能管 CUDA 等系统级依赖 |
| 同时维护多个 Python 版本 | uv 或 conda | 都能隔离管理 |
| 公司项目要求合规（无商业风险） | Miniforge | conda-forge 免费 |

---
结语

核心原则再强调一遍：非必要就不要把任何 Python 添加到系统环境变量。
PyPI 派：用 uv 管理 Python，通过 uv run 调用
Conda 派：用 miniforge 创建隔离环境，通过 conda activate 切换

现在，去创建一个项目试试吧。如果遇到问题，回到「常见问题」章节看看，或者检查一下是不是混用了两派的工具。

祝编码愉快。</content>
    <author><name>小丝瓜</name></author>
    <category term="Backend"/>
  </entry>
  <entry>
    <title>Windows 配置 C 语言开发环境</title>
    <link href="https://xsgovo.github.io/posts/%E5%AE%89%E8%A3%85c%E8%AF%AD%E8%A8%80%E7%8E%AF%E5%A2%83/" rel="alternate" type="text/html"/>
    <id>https://xsgovo.github.io/posts/%E5%AE%89%E8%A3%85c%E8%AF%AD%E8%A8%80%E7%8E%AF%E5%A2%83/</id>
    <published>2026-03-21T00:00:00.000Z</published>
    <updated>2026-03-21T00:00:00.000Z</updated>
    <summary>在 Windows 上安装 C 语言开发环境，包含编译器选择、VS Code 配置与 CMake 管理项目的方法。</summary>
    <content type="text">[!WARNING]
AI 生成内容声明：
本文内容由人工智能辅助生成，经过人工审阅与校对完成。

---

学 C 语言的第一步不是写代码，是把环境搭好。环境搭不好，后面全是坑。

Windows 上配 C 语言环境，我只推荐一个方案：MinGW-w64 + VS Code。其他方案要么过时，要么太重，要么藏着各种暗坑。等你把这组工具用熟了，想换 CLion 或者研究其他工具都很容易。

这篇文章就是教你把这套环境搭起来，从安装到能跑多文件项目。

---
为什么选择 MinGW-w64 + VS Code

在 Windows 上写 C 代码，你有很多种选择。但大多数选择都有问题。

Visual Studio 是微软的官方方案，功能强大，但体积动不动超过好几个G。更重要的是，它默认使用 MSVC 编译器，而国内教材、在线评测系统、Linux 服务器都用 GCC。MSVC 和 GCC 有差异，比如 scanfs 是微软的安全扩展，GCC 不认。你用 Visual Studio 写的代码，交到服务器上可能直接编译失败。

Dev-C++ 轻量，但已经停止维护多年。它的代码补全、调试功能、Git 集成都停留在 20 年前的水平。你能用它写课程作业，但写大一点的项目会很痛苦。

MinGW-w64 + VS Code 的优势在于：
编译器一致：GCC 是 Linux 世界的事实标准，也是国内教材默认用的编译器。你写的代码在 Windows 上能跑，在 Linux 服务器上也能直接编译，不用改。
轻量：MinGW-w64 只有几百 MB，VS Code 启动快，不吃内存。
灵活：VS Code 是编辑器，不是 IDE。你装什么插件，它就有什么功能。不需要的功能可以不装，保持简洁。
可迁移：这套配置是跨平台的。你以后换 Mac 或 Linux，VS Code 和 GCC 的配置基本不变，只需要改几个路径。

---
安装 MinGW-w64

MinGW-w64 是 GCC 编译器在 Windows 上的移植版本。它把你的 C 代码编译成 Windows 能运行的可执行文件，同时保持和 Linux GCC 的行为一致。
下载

官网地址：https://winlibs.com/

官网下载慢的话，可以用国内网盘：
123 云盘：https://www.123865.com/s/JnJ5Vv-GWIMA?pwd=ONsx#
百度网盘：https://pan.baidu.com/s/1MY19qEViOL0W4qTfl3CKFA?pwd=pcae
夸克网盘：https://pan.quark.cn/s/769ab8ff174c?pwd=dkm2

下载完成后解压。这里有一个关键细节：路径不能有中文，也不能有空格。

为什么？因为 Windows 的命令行工具对路径处理有历史遗留问题。空格会被解析成参数分隔符，中文在某些旧版工具链里会乱码。你如果把 MinGW 放在 C:\Program Files 或 D:\软件\mingw64，后面配置环境变量时可能会遇到各种奇怪的错误，比如「找不到命令」「路径不存在」「gcc 不是内部或外部命令」。

建议放在 D:/mingw64，根目录，纯英文，没有空格。这是最少麻烦的选择。

---
配置环境变量

解压完成后，需要把 MinGW 的 bin 目录添加到系统环境变量。环境变量是操作系统用来查找可执行文件的机制。当你在终端输入 gcc 时，系统会在 Path 里列出的目录中依次查找，找到就执行，找不到就报错。
方式一：使用脚本

解压后的目录里有一个 mingwvars.bat，双击运行。这个脚本会临时把 bin 目录加到当前终端的 Path 里，但关掉终端就失效。每次新开终端都要重新运行，麻烦，而且容易忘。
方式二：手动配置
右键「此电脑」-「属性」
点击「高级系统设置」
点击「环境变量」
在「系统变量」里找到 Path，双击编辑
新建一个条目，输入 D:/mingw64/bin（改成你实际的解压路径）
确定保存

重要：配置完成后，重启你的终端。

Windows 的环境变量不会自动同步到已打开的终端。你如果在配置之前就开了 PowerShell 或 CMD，那个终端里的 Path 还是旧的，输入 gcc 会提示找不到命令。这不是你的问题，是 Windows 的设计。关掉终端重新打开，或者重启电脑，都能解决。

---
验证安装

打开 PowerShell 或者 CMD，输入：

能看到类似这样的输出，说明配置成功：

如果提示 &quot;gcc 不是内部或外部命令&quot;，按以下顺序排查：
检查 Path：环境变量里有没有 D:/mingw64/bin，路径对不对
检查路径格式：有没有中文或空格
重启终端：配置环境变量之前打开的终端，需要重启才能读到新配置

这三件事排查完，99% 的问题都能解决。剩下 1% 建议重启电脑，重启能解决 90% 的问题，但解决不了路径带中文的那个。

---
安装 VS Code

VS Code 是微软出品的代码编辑器，2015 年发布，现在是最流行的代码编辑器之一。它的设计理念是「编辑器 + 插件」，核心功能轻量，需要什么功能就装什么插件。

下载地址：https://code.visualstudio.com/

安装过程没什么可说的，一直点下一步就行。建议勾选「添加到 PATH」，这样可以在终端用 code 命令打开文件。
推荐安装的插件

| 插件名称 | 提供者 | 功能 |
|---------|-------|------|
| C/C++ | Microsoft | C/C++ 语言支持，包括代码补全、语法高亮、调试 |
| CMake Tools | Microsoft | CMake 项目管理插件 |

装完这两个插件，VS Code 就能支持 C 语言开发了。

为什么不推荐装更多插件？因为插件越多，启动越慢，冲突越多。C/C++ 插件已经包含了 IntelliSense 代码补全、语法检查、调试支持，够用。CMake Tools 用来管理多文件项目，后面会讲到。其他插件等你遇到具体需求再装，不要提前预装一堆「可能有用」的东西。

---
用命令编译 C 程序

环境搭好，先写个最简单的程序验证一下。这一步是为了确认 gcc 能正常工作，也是理解 C 语言编译过程的基础。
创建测试文件

新建文件 main.c：

这段代码的作用是：包含标准输入输出库，定义主函数，打印一行文字，返回 0 表示正常结束。#include &lt;stdio.h&gt; 是预处理指令，告诉编译器把标准库的头文件内容插入到这里。printf 是标准库函数，负责把字符串输出到终端。
编译并运行

在终端执行：

这条命令做了三件事：
预处理：处理 #include 和宏定义，把 stdio.h 的内容插入到代码里
编译：把 C 代码翻译成汇编代码
链接：把汇编代码和目标文件链接成可执行文件

-o main.exe 指定输出文件名为 main.exe。如果不加 -o，Windows 下默认输出 a.exe，Linux 下默认输出 a.out。

编译成功后，当前目录会生成 main.exe，运行它：

看到输出 &quot;Hello, World!&quot; 就是成功了。

这一步跑不通，后面不用看了，回去检查环境变量。

---
配置 VS Code 调试

命令行编译能跑，但每次手动输入麻烦。VS Code 可以配置一键编译调试，还能打断点、看变量、单步执行。

VS Code 的调试系统由两部分组成：
tasks.json：定义「编译任务」，告诉 VS Code 怎么把代码编译成可执行文件
launch.json：定义「启动配置」，告诉 VS Code 怎么运行调试器

调试流程是：按 F5 → 执行 preLaunchTask（编译）→ 启动调试器 → 运行程序。

在项目根目录创建 .vscode 文件夹，里面放两个配置文件：
tasks.json（编译任务）

配置说明：
&quot;label&quot;: &quot;gcc build&quot;：任务名称，launch.json 会通过这个名字引用它
&quot;type&quot;: &quot;shell&quot;：在 shell 里执行命令
&quot;command&quot;: &quot;gcc&quot;：执行的命令
&quot;args&quot;：传递给 gcc 的参数
-g：生成调试信息，这样调试器才能知道代码行号和变量名
${fileBasename}：当前打开的文件名，VS Code 的变量
-o：指定输出文件
${fileBasenameNoExtension}.exe：去掉扩展名的文件名加 .exe
&quot;group&quot;: {&quot;kind&quot;: &quot;build&quot;, &quot;isDefault&quot;: true}：这是默认的构建任务，按 Ctrl+Shift+B 会执行它
&quot;problemMatcher&quot;: [&quot;$gcc&quot;]：捕获 gcc 的编译错误，显示在问题面板里
launch.json（调试配置）

配置说明：
&quot;name&quot;: &quot;C Debug&quot;：配置名称，显示在调试下拉框里
&quot;type&quot;: &quot;cppdbg&quot;：使用 C/C++ 调试器
&quot;request&quot;: &quot;launch&quot;：启动调试
&quot;program&quot;：要调试的可执行文件路径
&quot;cwd&quot;：工作目录
&quot;MIMode&quot;: &quot;gdb&quot;：使用 GDB 作为调试器
&quot;miDebuggerPath&quot;: &quot;gdb&quot;：GDB 的可执行文件路径，因为在环境变量里，直接写 gdb 就行
&quot;externalConsole&quot;: false：在 VS Code 内置终端里运行，不弹出新窗口
&quot;preLaunchTask&quot;: &quot;gcc build&quot;：启动调试前先执行编译任务

配好后，打开 C 源文件，按 F5 就能编译并启动调试。如果代码有语法错误，编译会失败，问题面板会显示错误信息。如果编译成功，程序会启动并在第一行断点处暂停（如果你打了断点的话）。

---
用 CMake 管理多文件项目

单个文件的程序用 gcc 直接编译就行。但代码量大了，要拆成多个文件管理，还要分头文件和源文件，手动编译就很烦。

假设你有这样的项目结构：

手动编译的命令会变成：

每次增删文件都要改命令，还要记住哪些文件需要编译。更复杂的情况是，有些文件需要先编译成库，有些文件依赖其他文件，编译顺序也有讲究。

CMake 是一个构建系统生成器。你写一个 CMakeLists.txt 描述项目结构和编译规则，CMake 会根据你的平台生成对应的构建文件（Windows 下是 Visual Studio 项目或 Makefile，Linux 下是 Makefile），然后自动处理编译顺序、依赖关系、增量编译等细节。
项目结构示例

一个典型的 C 项目结构：
include/：放头文件（.h），声明函数和接口
src/：放源文件（.c），实现函数逻辑
CMakeLists.txt：CMake 的配置文件

这种分离的好处是：头文件暴露接口，源文件隐藏实现。其他代码只需要包含头文件就能调用函数，不需要关心具体怎么实现的。

hello.h（头文件）：

#ifndef HELLOH 是「头文件保护」，防止同一个头文件被多次包含。如果多个源文件都包含了这个头文件，编译器只会处理一次，避免重复定义错误。

hello.c（函数实现）：

注意 include 路径。#include &quot;../include/hello.h&quot; 是相对路径，从 hello.c 的位置出发，上一级目录的 include 文件夹里找 hello.h。也可以用 #include &quot;hello.h&quot;，然后在 CMakeLists.txt 里用 includedirectories 指定头文件搜索路径。两种写法都可以，但一个项目里要统一，不要混着用。

main.c（主程序）：

main.c 只需要包含头文件 hello.h，就能调用 sayhello() 函数。它不需要知道 sayhello() 是在哪个源文件里实现的，这是「分离编译」的核心思想。
编写 CMakeLists.txt

配置说明：
cmakeminimumrequired(VERSION 3.10)：指定最低 CMake 版本，低于这个版本会报错
project(MyCProject C)：项目名称和语言，C 表示 C 语言（不是 C++）
set(CMAKECSTANDARD 11)：使用 C11 标准，支持 Generic、匿名结构体等新特性
set(CMAKEBUILDTYPE Debug)：调试模式，生成调试信息，不做优化
includedirectories(include)：添加头文件搜索路径，这样代码里写 #include &quot;hello.h&quot; 就能找到
addexecutable(main ...)：定义可执行文件目标，名称是 main，源文件列表是后面的那些

CMake 的优势在于跨平台。同样的 CMakeLists.txt，在 Windows 上可以用 Visual Studio 编译，在 Linux 上可以用 GCC 编译，在 Mac 上可以用 Clang 编译，不需要为每个平台写不同的构建脚本。
配置 CMake Tools

在 VS Code 里配置 CMake Tools：
点击左侧 CMake 图标，点击「配置」按钮，选择 GCC 作为工具包
或者点击 VS Code 底部的工具包按钮，选择 GCC

CMake Tools 会扫描系统里可用的编译器，列出你安装的 MinGW-w64。选择它之后，CMake Tools 会自动生成 build 目录，在里面放生成的构建文件。

CMake 支持「 out-of-source 」构建，意思是编译生成的文件和源代码分开。所有中间文件、可执行文件都在 build/ 目录里，源代码目录保持干净。这是最佳实践，避免把 .o、.exe 等生成文件和源代码混在一起。

---
调试 CMake 项目

CMake 项目的调试配置和单文件项目稍有不同，主要是可执行文件的路径变了。

tasks.json：

cmake --build build 的意思是：在 build 目录里执行构建。CMake 会根据 build 目录里的构建文件（Makefile 或 Visual Studio 项目）调用对应的工具完成编译。

launch.json：

注意 program 的路径是 ${workspaceFolder}/build/main.exe。CMake 把可执行文件输出到 build 目录里，而不是项目根目录。这是因为 CMake 默认使用 out-of-source 构建，所有生成物都放在 build 目录。

配好后按 F5 就能调试运行。CMake 会自动处理依赖关系，只编译修改过的文件，比手动用 gcc 逐个编译快得多。

---
其他方案

上面这套方案是我认为最适合大多数人的。如果你有特殊需求，可以考虑下面这些：
Dev-C++

老牌轻量 IDE，小熊猫改版比原版好用。适合只想快速跑通代码、不想折腾配置的人。

下载地址：http://royqh.net/redpandacpp/download/

选后缀带 MinGW64 的文件下载，安装完就能用。

但说实话，这工具的上限就在那里。你能用它写课程作业，但写大一点的项目会很痛苦。没有代码补全，没有调试，没有 Git 集成。它的定位是「让初学者快速入门」，不是「支撑专业开发」。
Visual Studio

功能强大的 IDE，体积也大。默认用 MSVC 编译器，和国内教材用的 GCC 有些差异。

下载地址：https://visualstudio.microsoft.com/zh-hans/

安装时勾选「使用 C++ 的桌面开发」。

如果你确定自己只会在 Windows 上写代码，且不在乎和教材的差异，可以用。但如果你以后要在 Linux 服务器上跑代码，建议还是 GCC。MSVC 的一些扩展（如 scanfs）不是标准 C，GCC 不认。

Visual Studio 的真正优势是调试器和性能分析工具，Visual Studio 自带的调试器为 x64dbg，在调试启动调试窗口后，按住 Ctrl + Alt + D可以打开反汇编的窗口，可以清晰的看到编写的C语言源码，编译的汇编代码和二进制在内存中的地址。这些是 VS Code + GDB 比不了的。

如果你写大型 C++ 项目，Visual Studio 是更好的选择。但纯 C 项目，MinGW-w64 + VS Code 够用。
CLion

JetBrains 出的专业 C/C++ IDE，内置 CMake 支持。非商业用途现在免费。

下载地址：https://www.jetbrains.com/zh-cn/clion/

需要配置 MinGW-w64 作为工具链，路径指向 D:/mingw64。

这工具很好，但很重。启动慢，吃内存。如果你的电脑配置一般，VS Code 更轻量。CLion 的优势是智能提示比 VS Code 强，重构功能更完善。但 VS Code 免费、开源、插件多，对大多数人来说够用。

---
常见问题

问题一：提示 &quot;gcc 不是内部或外部命令&quot;

环境变量没配好。检查：
bin 目录已经加到 Path 里
重启终端或者重启电脑后再试
路径没有中文或者空格

问题二：CMake 找不到编译器
确认 gcc --version 能正常输出版本
关掉所有终端，重新打开再执行 CMake

CMake 会缓存编译器信息，如果之前配置失败，缓存可能损坏。删掉 build 目录重新配置，或者执行 cmake --fresh 强制刷新。

问题三：VS Code 调试时提示找不到程序

检查 launch.json 里的 program 路径是否正确。CMake 项目的可执行文件在 build 目录里，单文件项目和 CMake 项目的配置不一样。

问题四：中文输出乱码

Windows 的编码问题。在代码里加一行：

或者在终端执行 chcp 65001 切换到 UTF-8 编码。

这是 Windows 的锅，不是你的。Linux 和 macOS 默认 UTF-8，不会有这个问题。Windows 历史遗留的 GBK 编码和 UTF-8 混用，导致各种乱码。上面的代码强制把控制台编码设为 UTF-8，和源代码编码一致，就能正常显示中文。

问题五：调试时断点不生效

检查编译时有没有加 -g 参数。-g 生成调试信息，没有它 GDB 不知道代码对应哪一行，断点就不会生效。CMake 项目里 set(CMAKEBUILDTYPE Debug) 会自动加 -g，Release 模式不会。

---

环境搭好只是开始，后面还有指针、内存、数据结构在等着你。但至少，你不用再为配置问题浪费时间了。</content>
    <author><name>小丝瓜</name></author>
    <category term="Programming"/>
  </entry>
  <entry>
    <title>使用 nvm 安装和管理 Node.js</title>
    <link href="https://xsgovo.github.io/posts/%E5%AE%89%E8%A3%85node/" rel="alternate" type="text/html"/>
    <id>https://xsgovo.github.io/posts/%E5%AE%89%E8%A3%85node/</id>
    <published>2026-03-20T00:00:00.000Z</published>
    <updated>2026-03-20T00:00:00.000Z</updated>
    <summary>使用 nvm 安装、切换和管理多版本 Node.js，并配置镜像与 pnpm。</summary>
    <content type="text">下载安装 nvm
下载地址：https://nvm.uihtm.com/doc/download-nvm

通常我会习惯将我电脑上的全部开发环境放到 D:\Dev\ ，就比如说安装nvm，我会放在D:\Dev\nvm，nodejs目录填 nvm 目录下面的一个子目录 D:\Dev\nvm\nodejs\ 之后你通过 nvm 下载的所有 Node 版本，都会放在 D:\Dev\nvm\ 里面。
使用pnpm

为什么要使用pnpm?

使用node自带的npm时，每个项目的 nodemodules 都是独立的副本。而在使用 pnpm 时，依赖会被存储在全局的内容可寻址的存储中，项目的 nodemodules 通过硬链接指向全局存储。因此，pnpm在磁盘上节省了大量空间，这与项目和依赖项的数量成正比，并且安装速度要快得多！

推荐直接安装pnpm二进制文件：

更新pnpm：
常用命令

这里整理了一下 nvm 最常用的命令：
配置镜像

在nvm中配置node镜像：

配置npm仓库镜像：

配置pnpm仓库镜像：

配完之后，npm install 和 pnpm install 都会走淘宝镜像。
package.json

package.json是一个包的清单文件。 它包含包的所有元数据，包括依赖项、标题、作者等等。 这是所有主要的 Node.js 包管理工具，包括 pnpm 的保留标准。

从 v16.13 开始，Node.js 附带 Corepack 用于管理包管理器。 这是一项实验性功能，因此你需要通过运行如下脚本来启用它：

Corepack提供了packageManager字段可以在项目中指定pnpm版本：

补充：Node.js TSC 已正式投票决定从 Node.js 25+ 移除 Corepack，它在 Node 24 及之前版本中仍为实验性功能。Corepack 正在被逐步淘汰。

最新的方法是使用devEngines.packageManager管理pnpm版本，看看就行，目前用的人不多，目前主流方法还是通过packageManager固定包管理器版本：</content>
    <author><name>小丝瓜</name></author>
    <category term="Frontend"/>
  </entry>
  <entry>
    <title>Ubuntu 安装 MySQL</title>
    <link href="https://xsgovo.github.io/posts/%E5%AE%89%E8%A3%85mysql/" rel="alternate" type="text/html"/>
    <id>https://xsgovo.github.io/posts/%E5%AE%89%E8%A3%85mysql/</id>
    <published>2026-03-08T00:00:00.000Z</published>
    <updated>2026-03-08T00:00:00.000Z</updated>
    <summary>介绍在 Ubuntu 系统上安装、配置并开启远程访问 MySQL 数据库的步骤。</summary>
    <content type="text">下载安装mysql

正经人谁用mysql?

在终端安装 MySQL（默认使用系统仓库当前版本）：
初始化安全配置（可选）

常见选项说明：
VALIDATE PASSWORD 插件：是否启用强密码验证
Remove anonymous users? 是否移除匿名用户
Disallow root login remotely? 是否禁止 root 用户远程登录
Remove test database and access to it? 是否删除 test 数据库
Reload privilege tables now? 重新加载权限
修改监听地址

编辑配置文件：

找到 bind-address = 127.0.0.1：

修改为 bind-address = 0.0.0.0，保存并退出。
创建管理员用户用于远程登录

重启 MySQL：

使用默认的 root 账号登录：

创建管理员账号（admin 可替换为自定义名称）：

确认用户是否创建成功：

示例输出：

| user             | host      | plugin                |
| ---------------- | --------- | --------------------- |
| admin            | %         | mysqlnativepassword |
| debian-sys-maint | localhost | cachingsha2password |
| mysql.infoschema | localhost | cachingsha2password |
| mysql.session    | localhost | cachingsha2password |
| mysql.sys        | localhost | cachingsha2password |
| root             | localhost | authsocket           |

当看到创建的用户且 plugin 为 mysqlnativepassword 即表示成功。

接下来可以用 DBeaver 等客户端连接数据库。

::github{repo=&quot;dbeaver/dbeaver&quot;}
远程连接常见问题排查
端口未放行：确保服务器防火墙/安全组已放行 3306 端口
服务未监听公网：确认 bind-address 已改为 0.0.0.0，并重启 MySQL
权限或账号不对：确认账号的 host 为 %，并重新 FLUSH PRIVILEGES
仍无法登录：确认使用的用户名、密码与数据库实例一致</content>
    <author><name>小丝瓜</name></author>
    <category term="Database"/>
  </entry>
</feed>
