首页/新闻资讯/正文详情

Monero 编译、调试与测试效率指南:基于 CMake 的开发者实战手册

发布时间:2026/9/23 9:36:37 来源:云帆数科 栏目:资讯中心
Monero 编译、调试与测试效率指南:基于 CMake 的开发者实战手册
区块链金融科技【免费下载链接】moneroMonero: 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_TYPEDebug调试构建共享库见下文make release/cmake-release-D CMAKE_BUILD_TYPERelease发布构建make release-test-D BUILD_TESTSON -D BUILD_GUI_DEPSON -D CMAKE_BUILD_TYPERelease后执行make make test发布构建 运行测试套件make debug-test-D BUILD_TESTSON -D BUILD_GUI_DEPSON -D CMAKE_BUILD_TYPEDebug后执行make make test调试构建 运行测试make debug-test-asan在上者基础上追加-D SANITIZEON启用 ASAN 内存消毒器的调试测试make release-static-D STATICON -D ARCHdefault -D CMAKE_BUILD_TYPERelease静态链接发布构建make coverage-D BUILD_TESTSON -D CMAKE_BUILD_TYPEDebug -D COVERAGEON带覆盖率报告的构建这些预设是可以被提取出来并按需修改的。例如从一个新建的构建目录中执行的最小外部 CMake 编译命令是cmake -S $DIR_SRC -DCMAKE_BUILD_TYPERelease make其中环境变量DIR_SRC存放 Monero 源码路径。-S指定源码目录CMAKE_BUILD_TYPE决定优化级别与调试信息。注意 Makefile 中release目标默认还会追加-D BUILD_TESTSON -D BUILD_GUI_DEPSONMakefile因此上面的最小命令比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_BUILDDIR1可使构建目录固定为build适用于非 git 源码树见 Makefile。场景一TDD 工作流 —— 为 Release 构建启用共享库构建共享库能大幅节省磁盘空间与链接时间。默认情况下只有 Debug 构建产出共享库这一逻辑定义在根 CMakeLists.txtset(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_TYPERelease -DBUILD_SHARED_LIBSON make当BUILD_SHARED_LIBSON时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_LIBSON构建正是为了快速迭代与缩短链接时间。为什么这契合 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、XcodemacOS与Visual StudioWindows等开发者可按平台选择。场景三在 Code::Blocks 中调试1. 准备可调试的构建假设DIR_SRC保存源码路径使用 2 个核心并行编译cmake -S $DIR_SRC -G CodeBlocks - Unix Makefiles -DCMAKE_BUILD_TYPEDebug -DBUILD_TESTSON make -j 2要点说明-DCMAKE_BUILD_TYPEDebug生成带调试符号的二进制是断点调试的前提-DBUILD_TESTSON构建测试目标。根 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_filterlogging.*在 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_filterlogging.*会精确命中这些用例。把同样的过滤参数传给 Code::Blocks 的调试器Project - Set programs arguments...在Programs arguments文本框中填入--gtest_filterlogging.*按F9或选择Build - Build and run验证预期的单元测试是否被正确执行。确认无误后设置好断点即可通过Debug - Start/Continue进入调试。GTest 过滤参数速查参数含义示例--gtest_list_tests列出所有已注册测试标签与用例名--gtest_list_tests--gtest_filterPATTERN按模式过滤测试*为通配符-表示排除--gtest_filterlogging.*排除语法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 编译器追加-fsanitizeaddress,undefined用于捕获内存越界、泄漏与未定义行为。若在 Code::Blocks 中调试时需要 ASAN可在生成工程文件的 CMake 调用中追加-DSANITIZEON。附文档提及的规划中特性原文档结尾提到两项待完成并合并的方向链接指向的 PR 内容并未包含在本仓库源码中仅作背景说明Multihost parallel compilation多主机并行编译跨机器分发编译任务以进一步缩短构建时间Unity builds联合构建将多个翻译单元合并编译减少编译与链接开销。截至本仓库当前快照这两项功能尚未在 CMakeLists.txt 或 Makefile 中体现读者可留意上游后续版本。这也提示Monero 的构建体系仍在持续演进跟踪 Makefile 与根 CMakeLists.txt 的变更即可第一时间获得新的编译技巧。小结本文给出的四条核心路径可以组合使用形成一条高效开发流水线最小编译cmake -S $DIR_SRC -DCMAKE_BUILD_TYPERelease make只保留你需要的目标TDD 加速Release 构建追加-DBUILD_SHARED_LIBSON让单文件修改 → 共享库替换 → 测试重跑 的循环代价最小IDE 集成cmake -G CodeBlocks - Unix Makefiles生成monero.cbp用Build - Select target选择目标精准调试--gtest_list_tests列出用例--gtest_filterlogging.*限定范围再经Project - Set programs arguments...注入 Code::Blocks 调试器配合断点完成快速定位。所有命令均以本仓库 Makefile 与根 CMakeLists.txt 的现有实现为准可随时对照源码验证其行为。赞分享区块链金融科技【免费下载链接】moneroMonero: the secure, private, untraceable cryptocurrency项目地址https://gitcode.com/gh_mirrors/mo/monero点击查看免费下载相关推荐ESP32终极入门指南3步完成Arduino环境搭建与物联网开发ESP32终极入门指南3步完成Arduino环境搭建与物联网开发 想要快速上手ESP32物联网开发却不知道从哪里开始作为Arduino官方支持的ESP32嵌入式物联网驱动开发FrankenPHP 贡献者开发指南从源码编译、测试到 CGO/PHP 联合调试的完整实战手册FrankenPHP 贡献者开发指南从源码编译、测试到 CGO/PHP 联合调试的完整实战手册 本篇指南面向希望为 FrankenPHPThe modern后端Wazuh dbsync 集成测试编译与运行指南基于 CMake 的 Linux 测试环境搭建实战Wazuh dbsync 集成测试编译与运行指南基于 CMake 的 Linux 测试环境搭建实战 本指南以 src/shared_modules/dbsyn网络安全IDS日志分析应用安全漏洞扫描创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

PHP汽修单管理系统开发与实战指南
PHP汽修单管理系统开发与实战指南

1. 项目背景与核心价值在汽车后市场服务领域,中小型汽修门店长期面临手工记录效率低下、客户信息分散、维修进度难追踪等痛点。这套基于PHP开发的汽修单管理系统,正是为解决这些实际问题而设计的轻量级数字化工具。我曾在三家不同规模的汽修厂实施过类似… · 2026/9/23 9:36:37

Java手机小说阅读器踩坑实录,一文搞懂性能优化与内存泄漏
Java手机小说阅读器踩坑实录,一文搞懂性能优化与内存泄漏

Java手机小说阅读器踩坑实录,一文搞懂性能优化与内存泄漏 面试被问原理答不上来,是不是让你后背发凉?很多后端转全栈或者做移动端支持的朋友,在写 java手机小说阅读器… · 2026/9/23 9:36:37

2026 电商 AI 产品图片生成工具推荐|8 款商家 AI 商拍工具对比
2026 电商 AI 产品图片生成工具推荐|8 款商家 AI 商拍工具对比

传统商品实拍,要协调影棚、摄影师、模特、道具,一套素材周期 7-15 天,新品测款、大促换场景、多 SKU 迭代时成本压力很大。2026 年国内 AI 商拍工具已经从单纯 “换背景”,进化到产品融图、批量套图、详情页长图、场景光影统一的完… · 2026/9/23 9:36:30

有关三国的游戏高频面试题性能优化实战指南
有关三国的游戏高频面试题性能优化实战指南

有关三国的游戏高频面试题性能优化实战指南 刚接手那个叫“有关三国的游戏”的项目时,我直接崩了。后台监控显示,每秒钟处理几千个玩家登录请求,服务器CPU却飙到90%以上,响应时间从50毫秒变成了2秒。最让我头疼的是,去翻官方源码仓库里的文档,… · 2026/9/23 11:57:10

html转word性能优化实战:完整示例带你从30秒缩至1秒
html转word性能优化实战:完整示例带你从30秒缩至1秒

html转word性能优化实战:完整示例带你从30秒缩至1秒 很多后端开发都遇到过这种尴尬:业务方急需把生成的 HTML 报告转成 Word 发给客户,你随手写了个转换脚本,本地测试 0.5 秒搞定,上线后生产环境直接卡死 30… · 2026/9/23 11:57:04

远程接入软件避坑指南:面试必问的5个致命陷阱与解法
远程接入软件避坑指南:面试必问的5个致命陷阱与解法

远程接入软件避坑指南:面试必问的5个致命陷阱与解法 刚学完 Python 或 Java 基础语法,对着 LeetCode 刷题都能过,但一让你搭个真实的后端服务,连怎么把本地代码跑起来让同事访问都搞不清楚?这是很多初级开发者最尴尬的时刻。在… · 2026/9/23 11:56:39

面试被问什么是esp答不上来?3个步骤源码解析彻底搞懂
面试被问什么是esp答不上来?3个步骤源码解析彻底搞懂

面试被问什么是esp答不上来?3个步骤源码解析彻底搞懂 上周技术面,面试官轻飘飘一句:“说说什么是 ESP?”我脑子里瞬间一片空白。明明平时用 C++ 写嵌入式,或者搞 Java… · 2026/9/23 11:56:32

8通道PCIe DMA控制器详解:四种模式与性能调优
8通道PCIe DMA控制器详解:四种模式与性能调优

简介:面向FPGA与PCIe高速接口开发者的8通道PCIe DMA控制器IP介绍手册,系统讲解基于PCI Express集成块的QDMA、RDMA、SGDMA与CDMA四种DMA引擎。手册重点剖析多通道QDMA子系统的描述符地址队列与分散聚合模式,以及多通道RDMA子系统的环形缓冲和… · 2026/9/23 11:56:13

3天吃透达内发现杯:从入门到精通的面试突围战
3天吃透达内发现杯:从入门到精通的面试突围战

3天吃透达内发现杯:从入门到精通的面试突围战 看了一堆教程还是不会写项目?这种无力感在准备“达内发现杯”这类技术竞赛或面试时尤为致命。很多人卡在“入门到精通”的断崖期,背了八股文却写不出能跑的代码。别慌,这不是你的问题,是训练路径错了。… · 2026/9/23 11:56:00

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码