Sphinx 找不到 Doxygen 导出的 xml 中的内容的解决方法

Sphinx + Breathe + Doxygen + CMake 的教程看这个就够了

https://devblogs.microsoft.com/cppblog/clear-functional-c-documentation-with-sphinx-breathe-doxygen-cmake/

但是他还是少写了一些东西,所以还是有一些小坑的

这些坑会导致 Sphinx 找不到 Doxygen 导出的 xml 中的内容,或者是报错

第一个是 conf.py 可能一直找不到 sphinx_rtd_theme 这个 module,即使你更新了 pip,重新下载了 sphinx_rtd_theme 好多遍,也没有办法

这个原因很简单,就是因为他没有找到你的 python 下载包的路径

我的 cmake 配置如下,主要是设置了一个虚拟环境,放在输出目录中,这样我们就可以不污染主机的 python 环境,也可以清楚地知道自己的包下载到哪里了

projectRoot/CMakeLists.txt

...# Docs only available if this is the main app
find_package(Doxygen)
if(Doxygen_FOUND)message(STATUS "Found Doxygen, building docs")add_subdirectory(docs)
else()message(STATUS "Doxygen not found, not building docs")
endif()

projectRoot/docs/CMakeLists.txt

option(BUILD_DOCS_USE_VENV "Generate Python virtual environment" ON)find_package(Python COMPONENTS Interpreter REQUIRED)
if (BUILD_DOCS_USE_VENV)set(DOCS_VENV "${CMAKE_CURRENT_BINARY_DIR}/venv")message(STATUS "Creating Python venv at ${DOCS_VENV}")execute_process(COMMAND ${Python_EXECUTABLE} -m venv ${DOCS_VENV})set(ENV{VIRTUAL_ENV} ${DOCS_VENV})set(Python_FIND_VIRTUALENV FIRST)unset(Python_EXECUTABLE)find_package(Python COMPONENTS Interpreter REQUIRED)execute_process(COMMAND ${Python_EXECUTABLE} -m pip install --no-cache wheelWORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}COMMAND_ERROR_IS_FATAL ANY)execute_process(COMMAND ${Python_EXECUTABLE} -m pip install --no-cache -r requirements.txtWORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}COMMAND_ERROR_IS_FATAL ANY)
endif()execute_process(COMMAND ${Python_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/../helper/req_check.py requirements.txtWORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}COMMAND_ERROR_IS_FATAL ANY
)find_program(SPHINX_EXECUTABLE sphinx-build HINTS ${DOCS_VENV}/Scripts ${DOCS_VENV}/bin REQUIRED)
message(STATUS "Found Sphinx: ${SPHINX_EXECUTABLE}")# Find all the public headers from runtime
get_target_property(RUNTIME_PUBLIC_HEADER_DIR ${RUNTIME_NAME} INTERFACE_INCLUDE_DIRECTORIES)
file(GLOB_RECURSE RUNTIME_PUBLIC_HEADERS CONFIGURE_DEPENDS ${RUNTIME_PUBLIC_HEADER_DIR}/*.h)# Find all the public headers from editor
get_target_property(EDITOR_PUBLIC_HEADER_DIR ${EDITOR_NAME} INTERFACE_INCLUDE_DIRECTORIES)
file(GLOB_RECURSE EDITOR_PUBLIC_HEADERS CONFIGURE_DEPENDS ${EDITOR_PUBLIC_HEADER_DIR}/*.h)message(--------------)
message(STATUS "${RUNTIME_PUBLIC_HEADERS}")
message(STATUS "${EDITOR_PUBLIC_HEADERS}")
message(--------------)set(DOXYGEN_INPUT_DIR ${PROJECT_SOURCE_DIR}/src)
set(DOXYGEN_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/doxygen)
set(DOXYGEN_INDEX_FILE ${DOXYGEN_OUTPUT_DIR}/xml/index.xml)
set(DOXYFILE_IN ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in)
set(DOXYFILE_OUT ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)# Replace variables inside @@ with the current values
configure_file(${DOXYFILE_IN} ${DOXYFILE_OUT} @ONLY)# Doxygen won't create this for us
file(MAKE_DIRECTORY ${DOXYGEN_OUTPUT_DIR})# Only regenerate Doxygen when the Doxyfile or public headers change
add_custom_command(OUTPUT ${DOXYGEN_INDEX_FILE}DEPENDS ${RUNTIME_PUBLIC_HEADERS} ${EDITOR_PUBLIC_HEADERS}COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYFILE_OUT}MAIN_DEPENDENCY ${DOXYFILE_OUT} ${DOXYFILE_IN}COMMENT "Generating docs"VERBATIM)# Nice named target so we can run the job easily
add_custom_target(Doxygen ALL DEPENDS ${DOXYGEN_INDEX_FILE})set(SPHINX_SOURCE ${CMAKE_CURRENT_SOURCE_DIR})
set(SPHINX_BUILD ${CMAKE_CURRENT_BINARY_DIR}/sphinx)
set(SPHINX_INDEX_FILE ${SPHINX_BUILD}/index.html)# Only regenerate Sphinx when:
# - Doxygen has rerun
# - Our doc files have been updated
# - The Sphinx config has been updated
add_custom_command(OUTPUT ${SPHINX_INDEX_FILE}COMMAND ${SPHINX_EXECUTABLE} -b html# Tell Breathe where to find the Doxygen output-Dbreathe_projects.MeowEngine=${DOXYGEN_OUTPUT_DIR}/xml${SPHINX_SOURCE} ${SPHINX_BUILD}WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}DEPENDS# Other docs files you want to track should go here (or in some variable)${CMAKE_CURRENT_SOURCE_DIR}/index.rst${DOXYGEN_INDEX_FILE}MAIN_DEPENDENCY ${SPHINX_SOURCE}/conf.pyCOMMENT "Generating documentation with Sphinx")# Nice named target so we can run the job easily
add_custom_target(Sphinx ALL DEPENDS ${SPHINX_INDEX_FILE})# Add an install target to install the docs
include(GNUInstallDirs)
install(DIRECTORY ${SPHINX_BUILD}
DESTINATION ${CMAKE_INSTALL_DOCDIR})

其中,获取 Doxygen 所需要的头文件那里,那里是我自己的项目的情况,一个 runtime 一个 engine,这个具体实现因项目而异

然后我们现在已经知道自己下载的包在哪里了,我们就在 conf.py 中直接把这个路径写进去

projectRoot/docs/conf.py

import sys
from pathlib import Pathsys.path.insert(0, str(Path('../build/docs/venv/Lib/site-packages/').resolve()))

然后还有一点坑的就是,在 conf.py 中我们要写明 breathe 的项目的名称和对应的 doxygen 输出的 xml 的位置:

projectRoot/docs/conf.py

breathe_projects = {"MeowEngine": "../build/docs/doxygen/xml"
}

完整的 conf.py

projectRoot/docs/conf.py

# Configuration file for the Sphinx documentation builder.
#
# For the full list of built-in configuration values, see the documentation:
# https://www.sphinx-doc.org/en/master/usage/configuration.html# -- Project information -----------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-informationimport sys
from pathlib import Pathsys.path.insert(0, str(Path('../build/docs/venv/Lib/site-packages/').resolve()))import sphinx_rtd_themeproject = 'MeowEngine'
copyright = '2023, CheapMeow'
author = 'CheapMeow'# -- General configuration ---------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configurationextensions = ['sphinx_rtd_theme', 'breathe']breathe_projects = {"MeowEngine": "../build/docs/doxygen/xml"
}templates_path = ['_templates']
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']# -- Options for HTML output -------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-outputhtml_theme = 'sphinx_rtd_theme'
html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
html_static_path = ['_static']

如果现在 sphinx 还是没有办法找到你的类的话,可能是你没有写明命名空间

projectRoot/docs/index.rst

.. doxygenclass:: Meow::MeowEngine:project: MeowEngine:members:

因为你可以看到 xml 里面的输出是带着命名空间的

projectRoot/build/docs/doxygen/xml/class_meow_1_1_meow_engine.xml

  <compounddef id="class_meow_1_1_meow_engine" kind="class" language="C++" prot="public"><compoundname>Meow::MeowEngine</compoundname>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/76325.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 PHP WorkerMan 构建 WebSocket 全双工群聊通信(二)

在很早很早以前&#xff0c;WebSocket 协议还没有被发明的时候&#xff0c;人们在 Web 端制作类实时数据动态更新时&#xff0c;一般采用轮询、 长连接 (Long Polling) 来实现。大概就是&#xff1a; 轮询&#xff1a;客户端不停发送 HTTP 请求给服务端&#xff0c;服务端返回…

在阿里云 linux 服务器上查看当前服务器的Nginx配置信息

我们可以通过命令 sudo nginx -t查看到nginx.conf的路径 可以通过 sudo nginx -T查看 nginx 详细配置信息&#xff0c;包括加载的配置文件和配置块的内容 其中也会包括配置文件的内容

环境扫描/透射电子显微镜气体样品架的真空压力和微小流量控制解决方案

摘要&#xff1a;针对环境扫描/透射电子显微镜对样品杆中的真空压力气氛环境和流体流量精密控制控制要求&#xff0c;本文提出了更简单高效和准确的国产化解决方案。解决方案的关键是采用动态平衡法控制真空压力&#xff0c;真空压力控制范围为1E-03Pa~0.7MPa&#xff1b;采用压…

git 合并分支某次(commit)提交

需求&#xff1a;将develop分支某次提交合并到master上面&#xff0c;其他修改不同步&#xff1b; //切换到master分支 git checkout master //查看develop分支提交记录&#xff0c;获取对应记录哈希值&#xff1b; git log develop // 按上下按钮可以上下查询对应记录&#xf…

typeScript--[接口interface的继承]

和类一样&#xff0c;接口也可以通过关键字 extents 相互继承。接口继承&#xff0c;分为&#xff1a;单继承和多继承&#xff0c;即继承多个接口。另外&#xff0c;接口也可以继承类&#xff0c;它会继承类的成员&#xff0c;但不包括具体的实现&#xff0c;只会把类的成员作为…

DevOps到底是什么意思?

前言: 当我们谈到 DevOps 时,可能讨论的是:流程和管理,运维和自动化,架构和服务,以及文化和组织等等概念。那么,到底什么是"DevOps"呢? 那么,DevOps是什么呢? 有人说它是一种方法,也有人说它是一种工具,还有人说它是一种思想。更有甚者,说它是一种哲学…

读高性能MySQL(第4版)笔记06_优化数据类型(上)

1. 良好的逻辑设计和物理设计是高性能的基石 1.1. 反范式的schema可以加速某些类型的查询&#xff0c;但同时可能减慢其他类型的查询 1.2. 添加计数器和汇总表是一个优化查询的好方法&#xff0c;但它们的维护成本可能很 1.3. 将修改schema作为一个常见事件来规划 2. 让事情…

仅做笔记用:Stable Diffusion 通过 ControlNet 扩展图片 / 扩图

发觉之前的 Outpainting 脚本效果仍旧不是很理想。这里又找了一下有没有效果更好的途径来扩图。于是就找到了通过 ControlNet 的方式来实现效果更好的扩图。这里临时记录一下在 Stable Diffusion 怎么使用 ControlNet 来扩展图片。 下载 control_v11p_sd15_inpaint_fp16.safet…

【源码】JavaWeb+Mysql招聘管理系统 课设

简介 用idea和eclipse都可以&#xff0c;数据库是mysql&#xff0c;这是一个Java和mysql做的web系统&#xff0c;用于期末课设作业 cout<<"如果需要的小伙伴可以http://www.codeying.top";可定做课设 线上招聘平台整合了各种就业指导资源&#xff0c;通过了…

Android获取系统读取权限

在Androidifest.xml文件中加上授权语句 <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE"/>

Git 概述命令、idea中的使用

目录 Git概述 Git代码托管服务 Git常用命令 Git 全局设置 获取 Git 仓库 ​编辑Git 工作区中文件的状态 本地仓库操作 远程仓库操作 ​编辑分支操作 标签操作 在IDEA中使用Git 1.获取Git仓库 .gitignore 表示忽略 2.本地仓库操作 3.远程仓库操作 4.分支操作 Git是…

C++设计模式-更新中

单例模式 这个类实现了单例模式。单例模式是一种设计模式&#xff0c;旨在确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取该实例。 在 ConnectionManager 类中&#xff0c;它通过以下方式实现了单例模式&#xff1a; 构造函数 ConnectionManager() 被声明为…

c++qt day2

封装一个结构体&#xff0c;结构体中包含一个私有数组&#xff0c;用来存放学生的成绩&#xff0c;包含一个私有变量&#xff0c;用来记录学生个数&#xff0c; 提供一个公有成员函数&#xff0c;void setNum(int num)用于设置学生个数 提供一个公有成员函数&#xff1a;void…

Spring Boot跨域问题简介

什么是跨域问题&#xff1f; 在Web开发中&#xff0c;跨域指的是在浏览器中访问一个不同于当前域名的资源。浏览器出于安全考虑&#xff0c;限制了这种跨域资源的访问。具体来说&#xff0c;当浏览器使用XMLHttpRequest或Fetch API发送跨域请求时&#xff0c;目标服务器必须在…

虚拟机Ubuntu操作系统最基本终端命令(安装包+详细解释+详细演示)

虚拟机及乌班图&#xff08;Ubuntu操作系统&#xff09; 提示&#xff1a;大家需要软件的可以直接在此链接中提取 链接&#xff1a;https://pan.baidu.com/s/1_4VHGTlXjIuVhBINeOuBCA 提取码&#xff1a;nd0c 文章目录 虚拟机及乌班图&#xff08;Ubuntu操作系统&#xff09;终…

PHP is_array()函数详解,PHP判断是否为数组

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 is_array 一、基本使用二、空数组三、同时判断多个…

多线程之基础篇(一)

一、Thread类 1、线程的创建 大家都熟知创建单个线程的三种方式&#xff0c;通过继承Thread类创建线程并重写该类的run()方法&#xff1b;通过实现Runnable接口创建线程一样要重写run()方法&#xff1b;以上的两个run()方法都是线程的执行体&#xff1b;第三&#xff0c;使用…

组件安全以及漏洞复现

组件安全 1. 概述 A9:2017-使⽤含有已知漏洞的组件 A06:2021-Vulnerable and Outdated Components ​ 组件&#xff08;例如&#xff1a;库、框架和其他软件模块&#xff09;拥有和应用程序相同的权限。如果应用程序中含有已知漏洞的组件被攻击者利用&#xff0c;可能会造成…

目标检测入门

一、目标检测任务对比 二、目标检测发展路线 基于深度学习的目标检测大致可以分为一阶段(One Stage)模型和二阶段(Two Stage)模型。目标检测的一阶段模型是指没有独立地提取候选区域(Region Proposal)&#xff0c;直接输入图像得到图中存在的物体类别和相应的位置信息。典型的一…

进程与线程的关系,进程调度的基本过程

目标&#xff1a; 1. 了解进程与线程的关系 2. 进程调度的基本过程 进程与线程的关系 在我们学习进程调度前&#xff0c;我们先了解一下进程与线程&#xff1a; 1.进程是线程的容器 进程包含线程&#xff0c;一个进程里可以有一个线程&#xff0c;也可以有多个线程。 多个线程…