- 区块链
- 金融科技
【免费下载链接】monero
Monero: the secure, private, untraceable cryptocurrency
本篇技术指南围绕 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文件中,后续每次修改只需:
- 重编译这一个源文件;
- 重新生成该实现对应的共享库;
- 再次运行测试——测试二进制无需重链,直接通过共享库加载最新实现。
因此,Release + 共享库的组合把 TDD 循环的编译成本压缩到"单文件重编译 + 库替换",这是该场景的核心收益。
场景二:为 IDE 生成工程文件
CMake 可以为多种 IDE 生成工程文件。查看支持的生成器列表:
cmake -G例如生成 Code::Blocks 的 Makefile 与工程文件:
cmake -G "CodeBlocks - Unix Makefiles" (...)该调用额外产出的工件是构建目录中的monero.cbp工程文件,可直接用 Code::Blocks 打开。其他常用生成器(以cmake -G实际输出为准)包括Eclipse CDT4 - Unix Makefiles、Ninja、Xcode(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_testsunit_tests目标在 tests/unit_tests/CMakeLists.txt 中定义,它链接了ringct、cryptonote_protocol、cryptonote_core、wallet、p2p等 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-asan与debug-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 的变更即可第一时间获得新的编译技巧。
小结
本文给出的四条核心路径可以组合使用,形成一条高效开发流水线:
- 最小编译:
cmake -S "$DIR_SRC" -DCMAKE_BUILD_TYPE=Release && make,只保留你需要的目标; - TDD 加速:Release 构建追加
-DBUILD_SHARED_LIBS=ON,让单文件修改 → 共享库替换 → 测试重跑 的循环代价最小; - IDE 集成:
cmake -G "CodeBlocks - Unix Makefiles"生成monero.cbp,用Build -> Select target选择目标; - 精准调试:
--gtest_list_tests列出用例,--gtest_filter="logging.*"限定范围,再经Project -> Set program's arguments...注入 Code::Blocks 调试器,配合断点完成快速定位。
所有命令均以本仓库 Makefile 与根 CMakeLists.txt 的现有实现为准,可随时对照源码验证其行为。
- 区块链
- 金融科技
【免费下载链接】monero
Monero: the secure, private, untraceable cryptocurrency
相关推荐
ESP32终极入门指南:3步完成Arduino环境搭建与物联网开发
ESP32终极入门指南:3步完成Arduino环境搭建与物联网开发 想要快速上手ESP32物联网开发,却不知道从哪里开始?作为Arduino官方支持的ESP32
嵌入式物联网驱动开发FrankenPHP 贡献者开发指南:从源码编译、测试到 CGO/PHP 联合调试的完整实战手册
FrankenPHP 贡献者开发指南:从源码编译、测试到 CGO/PHP 联合调试的完整实战手册 本篇指南面向希望为 FrankenPHP(The modern
后端Wazuh dbsync 集成测试编译与运行指南:基于 CMake 的 Linux 测试环境搭建实战
Wazuh dbsync 集成测试编译与运行指南:基于 CMake 的 Linux 测试环境搭建实战 本指南以 src/shared_modules/dbsyn
网络安全IDS日志分析应用安全漏洞扫描
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考