Monero 编译、调试与测试效率指南:基于 CMake 的开发者实战手册
2026/9/23 9:36:36 网站建设 项目流程
  • 区块链
  • 金融科技

【免费下载链接】monero

Monero: the secure, private, untraceable cryptocurrency

项目地址:https://gitcode.com/gh_mirrors/mo/monero
点击查看免费下载

本篇技术指南围绕 Monero 仓库中的 docs/COMPILING_DEBUGGING_TESTING.md 展开,面向希望借助 CMake 的新特性快速上手 Monero 源码开发、调试与测试的开发者。你将掌握基础编译的最小命令形态、为 Release 构建启用共享库以加速 TDD 迭代、为 IDE 生成工程文件,以及在 Code::Blocks 中配置 GTest 过滤器进行精准调试的完整流程。文中所有命令均可在本仓库中直接验证。

阅读提示:本文假设你已经阅读过 README.md 中的 "Build instructions" 一节,本节只补充超出 README 的开发效率技巧。README 中已明确:Monero 使用 CMake 构建系统,顶层 Makefile 负责按需调用 cmake 命令(README.md)。

基础编译:从 Makefile 预设到最小 CMake 命令

Monero 可以通过顶层 Makefile 编译,其中提供了多个预设目标。这些目标本质上是对cmake调用(携带各种选项)与make(构建或make test测试)的封装。查看 Makefile 可确认主要目标:

Makefile 目标对应的 CMake 核心参数用途
make debug/cmake-debug-D CMAKE_BUILD_TYPE=Debug调试构建(共享库,见下文)
make release/cmake-release-D CMAKE_BUILD_TYPE=Release发布构建
make release-test-D BUILD_TESTS=ON -D BUILD_GUI_DEPS=ON -D CMAKE_BUILD_TYPE=Release后执行make && make test发布构建 + 运行测试套件
make debug-test-D BUILD_TESTS=ON -D BUILD_GUI_DEPS=ON -D CMAKE_BUILD_TYPE=Debug后执行make && make test调试构建 + 运行测试
make debug-test-asan在上者基础上追加-D SANITIZE=ON启用 ASAN 内存消毒器的调试测试
make release-static-D STATIC=ON -D ARCH="default" -D CMAKE_BUILD_TYPE=Release静态链接发布构建
make coverage-D BUILD_TESTS=ON -D CMAKE_BUILD_TYPE=Debug -D COVERAGE=ON带覆盖率报告的构建

这些预设是可以被"提取"出来并按需修改的。例如,从一个新建的构建目录中执行的最小外部 CMake 编译命令是:

cmake -S "$DIR_SRC" -DCMAKE_BUILD_TYPE=Release && make

其中环境变量DIR_SRC存放 Monero 源码路径。-S指定源码目录,CMAKE_BUILD_TYPE决定优化级别与调试信息。注意 Makefile 中release目标默认还会追加-D BUILD_TESTS=ON -D BUILD_GUI_DEPS=ON(Makefile),因此上面的最小命令比make release更轻量——如果你只需要monerod等核心二进制而不需要测试与 GUI 依赖,可以这样裁剪。

值得注意的默认值:根 CMakeLists.txt 中option(BUILD_TESTS "Build tests." OFF)默认关闭测试,option(BUILD_GUI_DEPS "Build GUI dependencies." OFF)默认关闭 GUI 依赖,所以make release显式开启二者。此外USE_SINGLE_BUILDDIR=1可使构建目录固定为build(适用于非 git 源码树,见 Makefile)。

场景一:TDD 工作流 —— 为 Release 构建启用共享库

构建共享库能大幅节省磁盘空间与链接时间。默认情况下只有 Debug 构建产出共享库,这一逻辑定义在根 CMakeLists.txt:

set(BUILD_SHARED_LIBS_DEFAULT OFF) if (NOT STATIC AND CMAKE_BUILD_TYPE_LOWER STREQUAL "debug") set(BUILD_SHARED_LIBS_DEFAULT ON) endif() option(BUILD_SHARED_LIBS "Build internal libraries as shared" ${BUILD_SHARED_LIBS_DEFAULT})

即:非静态且构建类型为 Debug 时,BUILD_SHARED_LIBS默认置 ON;其余情况(包括 Release)默认 OFF。若想在 Release 构建中也产出动态库,追加该标志即可:

cmake -S "$DIR_SRC" -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON && make

BUILD_SHARED_LIBS=ON时,CMake 会输出Building internal libraries with position independent code并定义-DBUILD_SHARED_LIBS宏(CMakeLists.txt)。仓库内多个健康检查脚本(如 utils/health/clang-tidy-run-common.sh、utils/health/clang-include-what-you-use-run.sh、utils/health/clang-build-time-analyzer-run.sh)同样以-DBUILD_SHARED_LIBS=ON构建,正是为了快速迭代与缩短链接时间。

为什么这契合 TDD?

测试驱动开发(TDD)的典型节奏是:先编写描述类/方法(新)需求的测试,然后不断修改实现直到测试通过。测试本身通常需要很长的编译时间,所以理想情况是"只写一次"。而实现代码只要被恰当地封装在某个.cpp文件中,后续每次修改只需:

  1. 重编译这一个源文件;
  2. 重新生成该实现对应的共享库;
  3. 再次运行测试——测试二进制无需重链,直接通过共享库加载最新实现。

因此,Release + 共享库的组合把 TDD 循环的编译成本压缩到"单文件重编译 + 库替换",这是该场景的核心收益。

场景二:为 IDE 生成工程文件

CMake 可以为多种 IDE 生成工程文件。查看支持的生成器列表:

cmake -G

例如生成 Code::Blocks 的 Makefile 与工程文件:

cmake -G "CodeBlocks - Unix Makefiles" (...)

该调用额外产出的工件是构建目录中的monero.cbp工程文件,可直接用 Code::Blocks 打开。其他常用生成器(以cmake -G实际输出为准)包括Eclipse CDT4 - Unix MakefilesNinjaXcode(macOS)与Visual Studio(Windows)等,开发者可按平台选择。

场景三:在 Code::Blocks 中调试

1. 准备可调试的构建

假设DIR_SRC保存源码路径,使用 2 个核心并行编译:

cmake -S "$DIR_SRC" -G "CodeBlocks - Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTS=ON && make -j 2

要点说明:

  • -DCMAKE_BUILD_TYPE=Debug:生成带调试符号的二进制,是断点调试的前提;
  • -DBUILD_TESTS=ON:构建测试目标。根 CMakeLists.txt 默认关闭测试,必须显式开启;
  • -j 2:双核并行编译。README 建议每个线程预留约 1 核 CPU 与 2GB 内存(README.md)。

构建成功后,用 Code::Blocks 打开构建目录中的monero.cbp

2. 选择调试目标

从 Code::Blocks 菜单栏选择要调试的目标,以单元测试为例:

Build -> Select target -> Select target -> unit_tests

unit_tests目标在 tests/unit_tests/CMakeLists.txt 中定义,它链接了ringctcryptonote_protocolcryptonote_corewalletp2p等 Monero 核心库以及 GTest(${GTEST_LIBRARIES})。该文件同时将unit_tests注册为 CTest 测试,命令为unit_tests --data-dir "${TEST_DATA_DIR}"(tests/unit_tests/CMakeLists.txt)。

3. 用 GTest 过滤器缩短迭代周期

为避免每次调试都经历耗时初始化与无关代码执行,可以借助 GTest 的测试过滤能力,只运行关心的片段。先在构建目录列出全部已注册测试:

tests/unit_tests/unit_tests --gtest_list_tests

以日志模块为例,列表中会出现标签logging.及其子测试。只运行全部日志测试:

tests/unit_tests/unit_tests --gtest_filter="logging.*"

在 tests/unit_tests/logging.cpp 中可以看到该标签下的真实用例,例如TEST(logging, no_logs)TEST(logging, default)TEST(logging, glob_suffix)TEST(logging, multiline)TEST(logging, deadlock)等十余个测试,它们覆盖了 easylogging++ 的分类过滤、glob 匹配、多行日志与死锁回归等行为——--gtest_filter="logging.*"会精确命中这些用例。

把同样的过滤参数传给 Code::Blocks 的调试器:

Project -> Set program's arguments...

Program's arguments文本框中填入:

--gtest_filter="logging.*"

F9或选择:

Build -> Build and run

验证预期的单元测试是否被正确执行。确认无误后,设置好断点,即可通过:

Debug -> Start/Continue

进入调试。

GTest 过滤参数速查

参数含义示例
--gtest_list_tests列出所有已注册测试(标签与用例名)--gtest_list_tests
--gtest_filter="PATTERN"按模式过滤测试,*为通配符,-表示排除--gtest_filter="logging.*"
排除语法pattern1:-pattern2先包含后排除--gtest_filter="*:*Deadlock*"类组合

除命令行直接使用外,过滤参数同样适用于脚本化场景:仓库的 tests/libwallet_api_tests/libwallet_api_tests.py 通过LIBWALLET_API_TESTS_GTEST_FILTER环境变量读取过滤模式并传给--gtest_filter,可作为在 CI 或脚本中复用该机制的参考。

进阶:从 Makefile 预设出发的调试相关变体

结合 Makefile 中已封装的预设,可以派生出更多调试场景:

# 调试构建(默认启用共享库,迭代快) make debug # 调试构建 + 运行全部测试 make debug-test # 调试构建 + ASAN 内存/未定义行为消毒器 + 运行测试 make debug-test-asan # 纯调试构建(不构建测试) make debug-asan

其中debug-test-asandebug-asan依赖根 CMakeLists.txt 的SANITIZE选项:开启后会向 C/C++ 编译器追加-fsanitize=address,undefined,用于捕获内存越界、泄漏与未定义行为。若在 Code::Blocks 中调试时需要 ASAN,可在生成工程文件的 CMake 调用中追加-DSANITIZE=ON

附:文档提及的规划中特性

原文档结尾提到两项"待完成并合并"的方向(链接指向的 PR 内容并未包含在本仓库源码中,仅作背景说明):

  • Multihost parallel compilation(多主机并行编译):跨机器分发编译任务以进一步缩短构建时间;
  • Unity builds(联合构建):将多个翻译单元合并编译,减少编译与链接开销。

截至本仓库当前快照,这两项功能尚未在 CMakeLists.txt 或 Makefile 中体现,读者可留意上游后续版本。这也提示:Monero 的构建体系仍在持续演进,跟踪 Makefile 与根 CMakeLists.txt 的变更即可第一时间获得新的编译技巧。

小结

本文给出的四条核心路径可以组合使用,形成一条高效开发流水线:

  1. 最小编译cmake -S "$DIR_SRC" -DCMAKE_BUILD_TYPE=Release && make,只保留你需要的目标;
  2. TDD 加速:Release 构建追加-DBUILD_SHARED_LIBS=ON,让单文件修改 → 共享库替换 → 测试重跑 的循环代价最小;
  3. IDE 集成cmake -G "CodeBlocks - Unix Makefiles"生成monero.cbp,用Build -> Select target选择目标;
  4. 精准调试--gtest_list_tests列出用例,--gtest_filter="logging.*"限定范围,再经Project -> Set program's arguments...注入 Code::Blocks 调试器,配合断点完成快速定位。

所有命令均以本仓库 Makefile 与根 CMakeLists.txt 的现有实现为准,可随时对照源码验证其行为。

  • 区块链
  • 金融科技

【免费下载链接】monero

Monero: the secure, private, untraceable cryptocurrency

项目地址:https://gitcode.com/gh_mirrors/mo/monero
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询