Bitcoin Core Windows MSVC 原生构建指南:使用 CMake Presets 与 vcpkg 编译 bitcoind、CLI 工具与 GUI
本文基于 Bitcoin Core 仓库自带的 doc/build-windows-msvc.md 编写,系统讲解在 Windows 上用 Microsoft Visual Studio(MSVC)通过 CMake + vcpkg 原生编译 bitcoind、命令行工具(bitcoin-cli/bitcoin-tx/bitcoin-util 等)以及 bitcoin-qt GUI 的完整流程,并结合 CMakePresets.json、vcpkg.json 与 CMakeLists.txt 源码深入解释预设(presets)、vcpkg 三元组(triplets)与构建选项(BUILD_GUI、WITH_ZMQ 等)的底层机制。读完本文,你可以从零搭建 Windows 构建环境、正确选择静态/动态链接预设、定位 vcpkg 常见配置失败,并通过清单特性裁剪与杀毒软件排除等手段显著加速构建。
一、构建方式总览
Bitcoin Core 支持两种 Windows 二进制构建路径,这一点在 CMakeLists.txt 的注释中被明确记录(约 L291-L306):
- 在 Windows 上使用 MSVC 原生构建——即本文主题。运行时库通过
CMAKE_MSVC_RUNTIME_LIBRARY变量选择,并额外需要/Zc:__cplusplus等 MSVC 专属选项; - 使用 MinGW 交叉编译——文档指向仓库中的 build-windows.md(该路径在原文档中以相对链接
./build-windows.md给出)。
两种路径在 MSVC 分支上的关键差异见 CMakeLists.txt:
- 所有 Windows 构建都注入
_WIN32_WINNT=0x0A00、_WIN32_IE=0x0A00、WIN32_LEAN_AND_MEAN、NOMINMAX宏,目标 Windows 10 及以上系统; - MSVC 分支追加
_UNICODE;UNICODE宏、/utf-8、/Zc:preprocessor、/Zc:__cplusplus、/sdl编译选项; - 针对 Debug 配置,MSVC 会追加
/bigobj选项,规避汇编器无法处理超大目标文件的问题(源码注释引用了上游 issue #28109 的讨论); - 通过
CMAKE_VS_GLOBALS追加UseMultiToolTask=true,提升 MSBuild 编译并行度。
换句话说,这些 MSVC 细节由构建系统自动处理,构建者无需手工配置——这正是使用仓库自带 CMake 预设的意义所在。
二、环境准备
2.1 安装 Visual Studio(含 CMake 与 vcpkg)
本指南依赖 Visual Studio 安装中自带的 CMake 与 vcpkg 包管理器(vcpkg 的工具链文件通过 $env{VCPKG_ROOT} 被预设计引用,见下文)。
最低版本要求:Visual Studio 2026 版本 18.3,并安装“Desktop development with C++”工作负载。使用 WinGet 安装 Community 版及所需组件:
winget install --id Microsoft.VisualStudio.Community --override "--wait --quiet --add Microsoft.VisualStudio.Workload.NativeDesktop --add Microsoft.VisualStudio.Component.Git --includeRecommended"
该命令一次性安装:
- Visual Studio 本体;
- “Desktop development with C++”工作负载(NativeDesktop);
- Git 组件。
安装完成后,本文所有命令都应在 “Developer PowerShell for VS”(或 “Developer Command Prompt for VS”)中执行——该环境会正确设置 MSVC 编译器路径。下文假设均使用 Developer PowerShell。
说明:WinGet 在所有受支持的 Windows 版本上均可用;文中所有软件也可以手动安装替代。
2.2 安装 Python
运行测试套件需要 Python:
winget install python3
2.3 克隆仓库
git 已作为 Visual Studio 组件安装;若缺失可另行安装 Git for Windows。将 Bitcoin Core 仓库克隆到本地目录,所有构建脚本与命令都将从该目录执行:
git clone https://github.com/bitcoin/bitcoin.git
三、vcpkg 三元组与 CMake 预设
3.1 两个受支持的三元组
Bitcoin Core 项目支持以下两个 vcpkg 三元组:
| 三元组 | CRT 链接 | 库链接 | 对应 CMake 预设 |
|---|---|---|---|
x64-windows |
动态 | 动态 | vs2026 |
x64-windows-static |
静态 | 静态 | vs2026-static |
三元组与运行时库的对应关系由 CMakeLists.txt 实现:当 VCPKG_TARGET_TRIPLET 匹配 -static 时 msvc_library_linkage 置空(静态链接 CRT),否则为 DLL(动态链接),最终组合成 CMAKE_MSVC_RUNTIME_LIBRARY = "MultiThreaded$<$<CONFIG:Debug>:Debug>${msvc_library_linkage}"——即 Debug 配置用 vcd/libvcd,Release 配置用 vc/libvc。
3.2 仓库提供的预设
CMakePresets.json 中定义了 vs2026 与 vs2026-static 两个面向 Windows 的 configure 预设(均带 "hostSystemName == Windows" 条件,在非 Windows 主机上不会出现):
vs2026:生成器Visual Studio 18 2026,x64架构,工具链文件$env{VCPKG_ROOT}\scripts\buildsystems\vcpkg.cmake,缓存变量VCPKG_TARGET_TRIPLET=x64-windows、BUILD_GUI=ON、WITH_ZMQ=ON;vs2026-static:同上,仅VCPKG_TARGET_TRIPLET=x64-windows-static。
两个预设的关键行为:
- 默认
BUILD_GUI=ON(构建bitcoin-qt,拉取 Qt 6 依赖); - 默认
WITH_ZMQ=ON(启用 ZMQ 通知,对应 vcpkg 特性zeromq); - 工具链文件路径依赖环境变量
VCPKG_ROOT,因此必须在 Developer PowerShell 中运行——这正是前文强调环境的原因。
列出所有可用预设:
cmake --list-presets
四、构建流程
CMake 会将目标文件、库和可执行文件放入专门的构建目录(build directory)。以下命令使用 Release 配置,把 Release 替换为 Debug 同样可行。运行 cmake -B build -LH 可查看完整选项列表。
4.1 静态链接 + GUI(推荐分发形态)
cmake -B build --preset vs2026-static # 若 vcpkg 二进制缓存未填充或已失效,此步骤可能耗时较长
cmake --build build --config Release # 追加 "-j N" 指定 N 个并行任务
ctest --test-dir build --build-config Release # 追加 "-j N" 指定 N 个并行测试
cmake --install build --config Release # 可选,安装产物
该组合使用 x64-windows-static 三元组:CRT 与第三方库均静态链接,且默认 BUILD_GUI=ON、WITH_ZMQ=ON,产物是自包含的 bitcoind.exe、bitcoin-qt.exe 等。
4.2 动态链接 + 无 GUI
cmake -B build --preset vs2026 -DBUILD_GUI=OFF # 若 vcpkg 二进制缓存未填充或已失效,此步骤可能耗时较长
cmake --build build --config Release # 追加 "-j N" 指定 N 个并行任务
ctest --test-dir build --build-config Release # 追加 "-j N" 指定 N 个并行测试
-DBUILD_GUI=OFF 覆盖了预设中的缓存变量。从 CMakeLists.txt 可见 BUILD_GUI 的默认值本就是 OFF,而预设将其置为 ON;关闭 GUI 后,依赖项随之收缩:
- CMakeLists.txt 中
BUILD_GUI_TESTS是cmake_dependent_option,依赖BUILD_GUI;BUILD_TESTS,即无 GUI 时test_bitcoin-qt不构建; - CMakeLists.txt 中
WITH_QRENCODE依赖BUILD_GUI,随之关闭; - CMakeLists.txt 中
find_package(Qt 6.2 ...)仅在BUILD_GUI开启时执行,因此不会拉取 Qt 组件;这与 vcpkg 清单中qt特性的跳过逻辑相配合(见第六节)。
单元测试可执行文件 test_bitcoin 由 BUILD_TESTS(默认 ON)控制,ctest 步骤即运行这批测试(含 GUI 时还包括 Qt 测试)。
五、vcpkg 配置阶段的常见失败与规避
vcpkg 在 CMake configure 阶段的安装可能因为与 Bitcoin Core 本身无关的原因失败。文档给出两类典型场景与对应开关:
5.1 “Buildtrees path … is too long”
该错误在使用 BUILD_GUI=ON 且采用 Visual Studio 默认 vcpkg 安装路径时较常见(GUI 依赖 Qt 等大包,中间产物路径过长超出 Windows 传统路径限制)。使用 --x-buildtrees-root 指定一个更短的路径来存放中间构建文件:
cmake -B build --preset vs2026-static -DVCPKG_INSTALL_OPTIONS="--x-buildtrees-root=C:\vcpkg"
5.2 “Paths with embedded space may be handled incorrectly”
当本地 Bitcoin Core 仓库路径包含空格时可能出现该错误。通过覆盖 vcpkg 安装目录变量 VCPKG_INSTALLED_DIR 规避:
cmake -B build --preset vs2026-static -DVCPKG_INSTALLED_DIR="C:\path_without_spaces"
两者都是 vcpkg 与 CMake 集成的通用开关(随 Visual Studio 自带 vcpkg 提供),传入方式为追加 CMake 缓存变量,无需修改仓库内容。
六、性能优化
6.1 裁剪 vcpkg 清单默认特性
vcpkg.json 是 vcpkg 清单模式(manifest mode)下的依赖声明,default-features 列出 qt、tests、wallet、zeromq 四个特性,其中 qt 会拉取 qtbase(Qt 6,含 gui/network/png/testlib/widgets 子特性)、qttools 与 libqrencode,是体积与构建时间最大的依赖。
利用 vcpkg CMake 集成的 VCPKG_MANIFEST_NO_DEFAULT_FEATURES 与 VCPKG_MANIFEST_FEATURES 变量,可以跳过默认特性、只安装指定特性及其依赖。例如只保留 wallet 与 tests:
cmake -B build --preset vs2026 -DVCPKG_MANIFEST_NO_DEFAULT_FEATURES=ON -DVCPKG_MANIFEST_FEATURES="wallet;tests" -DBUILD_GUI=OFF -DWITH_ZMQ=OFF
可用特性即 vcpkg.json 中的 features 字段(原文档以仓库根路径 /vcpkg.json 引用,即 vcpkg.json):
| 特性 | 说明 | 依赖 |
|---|---|---|
qt |
构建 GUI,Qt 6 | qtbase(gui/network/png/testlib/widgets)、qttools、libqrencode |
tests |
构建 test_bitcoin.exe 单元测试可执行文件 |
boost-test |
wallet |
启用钱包(SQLite) | sqlite3 |
zeromq |
启用 ZMQ 通知 | zeromq |
此外,清单中的必选依赖只有 boost-multi-index。注意两点一致性约束:
- 跳过
qt特性时应同步-DBUILD_GUI=OFF,否则 CMakeLists.txt 中find_package(Qt 6.2 ... REQUIRED)会因包缺失而失败; - 跳过
zeromq特性时应同步-DWITH_ZMQ=OFF(CMakeLists.txt 中WITH_ZMQ开启时执行find_package(ZeroMQ 4.0.0 MODULE REQUIRED))。
从源码结构看,find_package 调用均与特性裁剪联动:wallet 特性对应 unofficial-sqlite3(vcpkg 命名空间约定,CMakeLists.txt),因此跳过 wallet 特性时需同步关闭 ENABLE_WALLET(默认 ON,见 CMakeLists.txt)。
清单还通过 builtin-baseline(当前为 9e593bb18ea69cc5095e012465dcd675a822ed0d,注释对应 vcpkg 2026-07-29 Release)锁定依赖基线,保证不同机器构建出一致版本的第三方库。首次配置时 vcpkg 可能从源码编译这些依赖,故原文档提示:“若 vcpkg 二进制缓存未填充或已失效,此步骤可能耗时较长”;缓存建立后,后续配置可显著提速。
6.2 排除杀毒软件实时扫描
为改善构建性能,可将 Bitcoin 仓库目录加入 Microsoft Defender 杀毒软件的排除列表。构建过程会产生海量中间文件(vcpkg 依赖编译 + 上千个目标文件),实时扫描会显著拖慢磁盘与 I/O 吞吐。
七、验证与产物
构建完成后:
- 单元测试:
ctest --test-dir build --build-config Release运行test_bitcoin(及 GUI 存在时的test_bitcoin-qt)测试套件,-j N可并行; - 产物位置:
bitcoind.exe、bitcoin-qt.exe、bitcoin-cli.exe等位于构建目录的对应配置子目录下;cmake --install build --config Release可按 CMakeLists.txt 中INSTALL_MAN等选项完成安装(含 man 页选项,默认ON); - 配置摘要:configure 阶段末尾 CMake 会打印各选项最终状态(如
bitcoin-qt (GUI) ... ${BUILD_GUI}、ZeroMQ ... ${WITH_ZMQ}、test_bitcoin ... ${BUILD_TESTS},见 CMakeLists.txt),可用于核对裁剪是否符合预期; - Debug 构建:把上述命令中的
--config Release替换为--config Debug即可,Debug 目标会额外注入DEBUG、DEBUG_LOCKORDER等宏(CMakeLists.txt),便于断言与锁序检查。
小结
| 步骤 | 命令 | 关键点 |
|---|---|---|
| 安装 VS 2026 18.3+ | winget install --id Microsoft.VisualStudio.Community --override "...NativeDesktop ..." |
需在 Developer PowerShell 中执行后续命令 |
| 安装 Python | winget install python3 |
测试套件所需 |
| 克隆仓库 | git clone https://github.com/bitcoin/bitcoin.git |
所有命令从此目录执行 |
| 静态 + GUI | cmake -B build --preset vs2026-static 等 |
x64-windows-static 三元组,默认 GUI/ZMQ 开启 |
| 动态 + 无 GUI | cmake -B build --preset vs2026 -DBUILD_GUI=OFF 等 |
x64-windows 三元组,跳过 Qt 依赖 |
| 提速 | -DVCPKG_MANIFEST_NO_DEFAULT_FEATURES=ON -DVCPKG_MANIFEST_FEATURES="wallet;tests" ... |
特性须与 CMake 选项(BUILD_GUI/WITH_ZMQ 等)保持一致 |
| 排障 | VCPKG_INSTALL_OPTIONS="--x-buildtrees-root=C:\vcpkg" / VCPKG_INSTALLED_DIR |
分别对应路径过长与路径含空格两类失败 |
掌握以上流程与预设、三元组、清单特性的对应关系后,即可在 Windows 上以 MSVC 完成从配置、编译、测试到安装的完整 Bitcoin Core 构建闭环;遇到 configure 阶段失败时,优先对照第五、六节的开关定位 vcpkg 层面的原因。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0624
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00