当前工作区的文件写入接口返回了权限错误,因此配置文件没有成功保存。你可以将下面内容保存为项目根目录下的Doxyfile:
PROJECT_NAME = "C/C++ Project" PROJECT_NUMBER = "1.0.0" PROJECT_BRIEF = "API documentation" OUTPUT_DIRECTORY = docs CREATE_SUBDIRS = NO INPUT = . FILE_PATTERNS = *.c *.cc *.cpp *.cxx *.h *.hh *.hpp *.hxx *.md RECURSIVE = YES EXCLUDE = ./docs ./build ./cmake-build-* EXTRACT_ALL = YES EXTRACT_PRIVATE = NO EXTRACT_STATIC = YES HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO SOURCE_BROWSER = YES INLINE_SOURCES = NO REFERENCED_BY_RELATION = YES REFERENCES_RELATION = YES USE_MDFILE_AS_MAINPAGE = README.md MARKDOWN_SUPPORT = YES HAVE_DOT = NO CLASS_DIAGRAMS = YES GENERATE_HTML = YES HTML_OUTPUT = html HTML_TIMESTAMP = YES GENERATE_TREEVIEW = YES DISABLE_INDEX = NO SEARCHENGINE = YES GENERATE_LATEX = NO GENERATE_XML = NO DOXYFILE_ENCODING = UTF-8 INPUT_ENCODING = UTF-8 OUTPUT_LANGUAGE = Chinese ALLOW_UNICODE_NAMES = YES QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = NO WARN_IF_DOC_ERROR = YES WARN_NO_PARAMDOC = NO WARN_AS_ERROR = NO WARN_LOGFILE = docs/doxygen-warnings.log ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SKIP_FUNCTION_MACROS = YES HTML_COLORSTYLE = AUTO_LIGHT HTML_COLORSTYLE_HUE = 220 HTML_COLORSTYLE_SAT = 100 HTML_COLORSTYLE_GAMMA = 80 USE_MATHJAX = NO SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = YES在包含Doxyfile的目录中执行:
doxygen Doxyfile生成的 HTML 首页位于:
docs/html/index.html如果希望扫描指定源代码目录,可以把:
INPUT = .改成:
INPUT = src include如果没有README.md,则删除这一行:
USE_MDFILE_AS_MAINPAGE = README.md如果是一个cuda项目,里面既有c cpp 还有cu文件,那么,
适用。Doxygen 可以处理同时包含.c、.cpp、.cu和.cuh的 CUDA 项目,但需要把 CUDA 文件映射为 C++,并让预处理器忽略部分 CUDA 关键字。
在之前的Doxyfile中修改以下配置即可:
FILE_PATTERNS = *.c \ *.cc \ *.cpp \ *.cxx \ *.h \ *.hh \ *.hpp \ *.hxx \ *.cu \ *.cuh \ *.md EXTENSION_MAPPING = cu=C++ \ cuh=C++建议将完整的预处理配置写成:
ENABLE_PREPROCESSING = YES MACRO_EXPANSION = YES EXPAND_ONLY_PREDEF = YES SKIP_FUNCTION_MACROS = YES PREDEFINED = __CUDACC__ \ "__host__=" \ "__device__=" \ "__global__=" \ "__shared__=" \ "__constant__=" \ "__managed__=" \ "__restrict__=" \ "__forceinline__=inline" \ "__noinline__=" \ "__align__(x)=" \ "__launch_bounds__(x)="作用是让 Doxygen 分析下面的 CUDA 代码时,不被 CUDA 专用修饰符干扰:
__global__voidvector_add(constfloat*a,constfloat*b,float*c,intn);Doxygen 会近似把它当成:
voidvector_add(constfloat*a,constfloat*b,float*c,intn);这里只影响文档解析,不会修改或影响 CUDA 编译。
适合 CUDA 项目的关键配置可以整合为:
PROJECT_NAME = "CUDA Project" INPUT = src include RECURSIVE = YES FILE_PATTERNS = *.c *.cc *.cpp *.cxx \ *.h *.hh *.hpp *.hxx \ *.cu *.cuh *.md EXTENSION_MAPPING = cu=C++ cuh=C++ EXCLUDE = build \ docs \ cmake-build-* \ third_party EXTRACT_ALL = YES EXTRACT_STATIC = YES SOURCE_BROWSER = YES REFERENCED_BY_RELATION = YES REFERENCES_RELATION = YES ENABLE_PREPROCESSING = YES MACRO_EXPANSION = YES EXPAND_ONLY_PREDEF = YES SKIP_FUNCTION_MACROS = YES PREDEFINED = __CUDACC__ \ "__host__=" \ "__device__=" \ "__global__=" \ "__shared__=" \ "__constant__=" \ "__managed__=" \ "__restrict__=" \ "__forceinline__=inline" \ "__noinline__=" \ "__align__(x)=" \ "__launch_bounds__(x)=" GENERATE_HTML = YES HTML_OUTPUT = html GENERATE_TREEVIEW = YES GENERATE_LATEX = NO OUTPUT_DIRECTORY = docs OUTPUT_LANGUAGE = Chinese INPUT_ENCODING = UTF-8CUDA 函数的注释写法和普通 C++ 一样:
/** * @brief 在 GPU 上执行向量加法。 * * 每个 CUDA 线程负责计算一个数组元素。 * * @param[in] a 输入向量 A 的设备指针。 * @param[in] b 输入向量 B 的设备指针。 * @param[out] c 输出向量 C 的设备指针。 * @param[in] n 向量元素数量。 * * @pre `a`、`b` 和 `c` 必须指向有效的设备内存。 * @note 该函数是 CUDA 核函数,必须使用 `<<<grid, block>>>` 启动。 */__global__voidvector_add(constfloat*a,constfloat*b,float*c,intn);CPU 包装函数也可以单独说明:
/** * @brief 启动向量加法 CUDA 核函数。 * * @param[in] a 输入向量 A 的设备指针。 * @param[in] b 输入向量 B 的设备指针。 * @param[out] c 输出向量 C 的设备指针。 * @param[in] n 向量元素数量。 * @param[in] stream CUDA 执行流。 * * @return CUDA API 返回的错误状态。 */cudaError_tlaunch_vector_add(constfloat*a,constfloat*b,float*c,intn,cudaStream_t stream);# Doxygen configuration for a mixed C/C++/CUDA project. PROJECT_NAME = "CUDA Project" PROJECT_NUMBER = "1.0.0" PROJECT_BRIEF = "C/C++/CUDA API documentation" OUTPUT_DIRECTORY = docs CREATE_SUBDIRS = NO # Change INPUT to "src include" when those are the only source directories. INPUT = . RECURSIVE = YES FILE_PATTERNS = *.c \ *.cc \ *.cpp \ *.cxx \ *.h \ *.hh \ *.hpp \ *.hxx \ *.cu \ *.cuh \ *.md EXTENSION_MAPPING = cu=C++ \ cuh=C++ EXCLUDE = ./docs \ ./build \ ./cmake-build-* \ ./third_party EXCLUDE_PATTERNS = */.git/* \ */CMakeFiles/* EXTRACT_ALL = YES EXTRACT_PRIVATE = NO EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO SOURCE_BROWSER = YES INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = YES REFERENCES_RELATION = YES CALL_GRAPH = NO CALLER_GRAPH = NO MARKDOWN_SUPPORT = YES USE_MDFILE_AS_MAINPAGE = README.md AUTOLINK_SUPPORT = YES # Parse CUDA files as C++ and remove CUDA-only qualifiers. ENABLE_PREPROCESSING = YES MACRO_EXPANSION = YES EXPAND_ONLY_PREDEF = YES SKIP_FUNCTION_MACROS = YES PREDEFINED = __CUDACC__ \ "__host__=" \ "__device__=" \ "__global__=" \ "__shared__=" \ "__constant__=" \ "__managed__=" \ "__restrict__=" \ "__forceinline__=inline" \ "__noinline__=" \ "__align__(x)=" \ "__launch_bounds__(x)=" GENERATE_HTML = YES HTML_OUTPUT = html HTML_TIMESTAMP = YES GENERATE_TREEVIEW = YES DISABLE_INDEX = NO SEARCHENGINE = YES GENERATE_LATEX = NO GENERATE_XML = NO GENERATE_MAN = NO DOXYFILE_ENCODING = UTF-8 INPUT_ENCODING = UTF-8 OUTPUT_LANGUAGE = Chinese ALLOW_UNICODE_NAMES = YES QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = NO WARN_IF_DOC_ERROR = YES WARN_NO_PARAMDOC = NO WARN_AS_ERROR = NO WARN_LOGFILE = docs/doxygen-warnings.log HAVE_DOT = NO CLASS_DIAGRAMS = YES USE_MATHJAX = NO SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = YES需要注意:Doxygen 的职责是生成 API 文档,并不会验证 kernel 的线程配置、设备指针或 CUDA 代码是否能正确编译。CUDA 编译正确性仍应由nvcc、CMake 和测试程序保证。