Doxygen生成PDF需LaTeX支持,必须配置GENERATE_LATEX= YES、GENERATE_PDF= YES、OUTPUT_DIRECTORY,并安装对应LaTeX工具链及宏包(如ctex),中文推荐xelatex方案,错误排查优先查看latex/refman.log。

Doxygen生成PDF需要LaTeX支持,不是开箱即用
Doxygen本身不直接生成PDF,它依赖LaTeX工具链(如pdflatex)把生成的.tex文件编译成PDF。没装LaTeX或路径没配对,make pdf会直接报错——最常见的是pdflatex: command not found或make: *** [pdf] Error 2。
实操建议:
- Linux/macOS:推荐用
texlive-full(Ubuntu/Debian)或basic-tex+手动补latexmk、ucs、hyperref等宏包;macOS用brew install --cask mactex更省事 - Windows:安装
TeX Live时勾选“Add TeX Live binaries to PATH”,否则Doxygen找不到pdflatex - 验证方式:终端运行
pdflatex --version和latexmk --version,都返回版本号才算就位
配置Doxyfile关键项:OUTPUT_FORMAT和GENERATE_PDF必须设为YES
很多人改了GENERATE_LATEX = YES就以为够了,但漏掉GENERATE_PDF = YES,结果make pdf根本不会触发。Doxygen默认只生成LaTeX源码,PDF是后续Makefile阶段的事。
必须确认以下三项都启用:
立即学习“C++免费学习笔记(深入)”;
-
GENERATE_LATEX = YES(生成latex/目录下的.tex文件) -
GENERATE_PDF = YES(让Doxygen在latex/里生成Makefile并调用make pdf) -
OUTPUT_DIRECTORY = ./docs(避免输出散落在当前目录,且确保latex/子目录可写)
顺带一提:LATEX_CMD_NAME = pdflatex一般不用改,除非你用xelatex处理中文——那得同步改LATEX_COMPILER = xelatex并调整latex/Makefile里的引擎调用。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
中文支持不靠Doxygen,靠LaTeX宏包和字体配置
Doxygen导出的.tex默认用utf8编码,但pdflatex原生不支持中文。直接编译会卡在! Package inputenc Error: Unicode character …。
解决路径只有两条:
- 简单方案:把
LATEX_COMPILER设为xelatex,并在latex/Makefile里确认TEXINPUTS包含中文字体路径,再往latex/ refman.tex头部插入:\usepackage{ctex} \ctexset{fontset=founder}(需系统已装ctex宏包) - 硬核方案:保留
pdflatex,但要在EXTRA_PACKAGES = ctex里声明,并确保ctex支持pdflatex的UTF8+gbsn字体组合——实际容易因字体缺失失败,不推荐
注意:INPUT_ENCODING = UTF-8必须存在,否则Doxygen读C++源码时就乱码,后续LaTeX更没法救。
make pdf失败时优先检查latex/目录下的日志和临时文件
Doxygen执行make pdf本质是进latex/目录跑make,所有错误细节都在latex/refman.log里。别只看终端红字——比如! LaTeX Error: File `tikz.sty' not found,说明缺tikz宏包,不是Doxygen配置问题。
快速排障步骤:
- cd
latex/→ 手动运行make clean再make pdf,排除缓存干扰 - 查
refman.log末尾几行,定位第一个! LaTeX Error或Emergency stop - 若报
File `doxygen.sty' not found,说明Doxygen安装不完整,重装或检查DOXYGEN_LATEX_STY路径 - 图形编译失败(如
dot图)?确认DOT_PATH指向Graphviz的bin目录,且HAVE_DOT = YES
PDF生成慢、卡住、页眉空白——八成是LaTeX模板或字体加载超时,不是代码注释问题。这时候翻refman.log比重写@brief有用得多。


















