??xml version="1.0" encoding="utf-8" standalone="yes"?> 虽然jdk自带的javadoc也很好用Q不q用doxygen+GraphViz
的组合可以生成许多强大的图(cd、协作图、文件包?被包含图、函数调?被调用图、类l承体系囄Q,另外Qdoxygen支持直接生成chm文档Q?
支持LaTeX公式Q如果你有一个支持php的服务器Q生成的htmlq可以加入一个搜索框?br>
?a >Doxygen使用?docx?nbsp;?a >DBOp.chm?/p>
生成图演C: Doxygen是一U开源跨q_的,以类似JavaDoc风格描述的文系l,完全支持C、C++、Java、Objective-C和IDL语言Q部分支持PHP、C#。注释的语法与Qt-Doc、KDoc和JavaDoc兼容?a name=baidusnap2>Doxgen可以从一套归源文g开始,生成HTML格式的在U类览器,或离U的LATEX、RTF参考手册。对于未归档的源文gQ也可以通过配置Doxygen来提取代码结构。或者借助自动生成的包含依赖图Qinclude dependency graphsQ、承图Q?a name=baidusnap0>inheritance diagramQ以及协作图Qcollaboration diagramQ来可视化文档之间的关系。Doxygen生成的帮助文档的格式可以是CHM、RTF、PostScript、PDF、HTML和Unix man page{?/p>
Doxygen在Linux上开发,但也可以在其它的Unixq_下运行。而且QWindows 9x/NTq_下也有对应的可执行版本?/p>
首先Q去Doxygen|站上找到最新版本的Doxygen。有二进制或源码两种版本Q如果不想重头编译,下蝲二进制版本安装即可。在Linux下,源码~译需要perl和Gnu工具flex、bison、make的支持。在Windows下,二进制版本勿需安装Q而源码编译所需支持工具较多。我们仅讲述Linux下的Doxygen的源码编译以及二q制版本安装q程?/p>
~译源码 安装二进制版?/strong> 二进制文件安装目录是<prefix>/binQ其?lt;prefix>~省?usrQ可以通过configure的参?-prefix修改其倹{用make install_docs可以把文和例子安装在目?lt;docdir>/doxygenQ其?lt;docdir>~省?lt;prefix>/share/doc/packagesQ可以通过configure的参?-docdir修改其倹{doxygen是bin目录下的一个命令行E序Q它是Doxygen的核心工P完成文档的{换和生成工作?/p>
?是Doxygen|站上给出的Doxygen处理工具以及它们之间的信息流?/p>
从图中可以看出,Doxygen可执行程序位于正中,所有的程都围l着它进行。左侧图标表CDoxygen的输入可以是源文Ӟ或者是定制的头文g、图像、注解等。Doxygen图标上部是配|文Ӟ由Doxywizard处理Q下部是Tag文gQ由Doxytag处理。后面是Doxygen输出文g的类型,依次是XML、Latex、Man pages、RTF和HTMLQ可处理cd图标之后是进行进一步{换所需的工兗?/p>
? Doxygen|站上给出的Doxygen信息图 每一个Doxygen工程都有一个后~?cfg的配|文Ӟ用来保存所有的讄。配|文件的格式与autoexec.bat、config.sys{文件相|是由名称/值对l成的ASCII码,会由doxygen命o来解析。ؓ了简化创建和修改配置文gQDoxygen可以在命令行方式下加上参?g自动创徏模板文g?/p>
doxygen -g <config-file> 忽略<config-file>会生成一个名为Doxyfile的缺省文Ӟ如果<config-file>已经存在Q会被Doxygen改名?lt;config-file>.bak?/p>
实际上,我们Ҏ׃需要用一般的~辑器来~辑配置文gQDoxygen提供了一个辅助工具Doxywizard。Doxywizard是Doxygen的GUI前台Q用户可以能q它来读写配|文Ӟ省却了手工配|的ȝ。基本上Q在Doxywizard中可以完成Doxygen的绝大多数工作,而且Doxygen也可以在由Doxywizard启动Q这样就使得整个q程比较q诏?/p>
虽然如此Q我们还是要理解常见的各个Tag的含义。在Doxywizard中,可以看到q些Tag以自明的方式命名Q我们大致可以从名称中看出其作用。这些Tag被Doxywizard大致分ؓ几类Q其中HTML到PerlMod是输出文件种c设|,Project是Doxygen工程讄QBuild是编译类选项QMessages为出错或异常选项QInput入源选项Q等{?/p>
? Doxywizard Doxygen规定了进行注释的一些格式,正确的注释才能Doxygen生成文档。第一个代码条目,都有两种描述Q简要描q和详细描述Q两者都是可选的。简要描q只有一行,而详l描q则提供更长、更仔细的描qͼDoxygen只允许有一个简要描q和详细描述?/p>
在Doxygen中,一般只会处理与E序l构相关的注释,函数内部的注释通常不做处理。对于详l描q来_有下面几U表C方式?/p>
Doxygen支持的指令非常多Q主要作用是控制输出文的排版格式。命令以"\"?@"号开始?/p>
一些命令可以有多个参数Q一些命令只有一个参数。参数周围的括号使用是有含义的: 下面章节中也涉及C些命令的使用Q其它的命o可以查阅Doxygen用户手册?/p>
Doxygen有许多方法可以创建项目列表?/p>
Doxygen有两U分l机制。第一U是全局Cؓ每一个组创徏一个网,此时分组被称?module"Q第二种是用于复合实体中的成员列表,此时分组被称?member group"。Module是一U把内容在单个网上分组的方法。分l可以包括filesQnamespaceQclassesQfunctionsQvariablesQenumsQtypedefs和definesQ也可以包含其它分组。复合实体(compound entitiesQ如cR文件、命名空间等可以分布在多个分l中Q而成员实体(memberQ如变量、函数、typedef{只能归属于一个分l?/p>
定义分组的方法是在特D注释块中用命令\defgroup和\addtogroup?defgroup的格式如下: \defgroup <唯一标识?gt; Q中间可以有I格的标题) 两次使用同一标识名,在doxygen解析的时候会出现错误。命令addtogroup与defgroup不同的地方在于,如果使用了同一标识Q则会在改组中加入新的项Q如果标识不重复Q则会创建分l。addtogroup中的标题是可选的?/p>
声明分组之后Q如果要使某个实体归属某一分组Q需要用ingroup命o。避免在每个成员之前都用ingroup命oQ可以将member用@{和@}装h?/p>
上面q些命o都是有优先的,doxygen会根据优先实体放入具有最高优先的分l之中。它们的优先U顺序是QingroupQdefgroupQaddtogroupQweakgroup。weakgroupcM一个低优先U的addtogroup。在.h文g中可以用高优先U的命o定义层次l构Q在.c文g中\weakgroup׃需要准遵?h文g中定义的层次l构?/p>
如果要把不同的类型归入同一分组内,p使用Member groupQ它的定义方法如下: Member group不可以嵌套?/p>
Doxygen里有内置生成C++cdơ图的功能。它使用贝尔实验室开发的graphviz 1.5中的工具"dot"来生成更高的图表。用这个工hQ要配|选项HAVE_DOT设ؓYES?/p>
更具体的信息可以参考Doxygen的手册?/p>
Doxygen可以把LaTeX格式的公式输出出来。要在HTML文里包含公式,需要安装下面的工具QlatexQLaTeX~译器)、dvipsQ将DVI文g转换为PS文gQ、gsQ将PS文g转换Z图)?/p>
包含公式的方法有两种Q?/p>
Doxygen支持多种语言Q输Z文文的时候,只需要将配置文g中的OUTPUT_LANGUAGE标签讄为Chinese卛_Q用Doxywizard修改更方便)?/p>
有一个需要注意的问题是,在Windows下的览器浏览中文HTML文档Ӟ英文字母会变得很隄Q解决的办法是将doxygen_cn.css下蝲到本地硬盘,q将配置文g中的HTML_STYLESHEET修改个文件的位置?/p>
HTML_STYLESHEET=c:\doxygen\doxygen.css 在命令行下运行doxygen是很单的Q只需要指定配|文件即可?/p>
doxygen project.cfg 或者,也可以用Doxywizard在配|完后直接运行doxygen?/p>
安装完doxygen后即可进行适当的配|,然后q行doxyfile生成文。基本的配置前h早有说明Q不再赘q。需要注意的是: 1.要勾选Dot选项卡下面的HAVE_DOT、CALL_GRAPH 、CALLER_GRAPH 选项。ƈ在DOT_PATH下面填入dot.exe的\径,也就是graphviz安装目录下的bin文g夏V?/p>
2.NWizard->Project选项卡下面的Scan recursivelyQ?/p>
3.NBuild选项卡下面的EXTRACT_ALL、EXTRACT_PRIVATE、EXTRACT_STATIC、EXTRACT_LOCAL_CLASSES、EXTRACT_LOCAL_METHODS选项 4.如果E序里面有中文,Project选项卡下的DOXYFILE_ENCODING和Input选项卡下面的INPUT_ENCODING改ؓGBK 5.可以勾掉LATEX输出Q这栯省编译时?/p>
doxygen是开源的C语言软体Q可以在它的官方|站上下载到软体和源码:
http://www.stack.nl/~dimitri/doxygen
使用它的doxyWizard很是方便^^ 具体用法我写在了附g的文档中Q不q注释是C++版,doxygen是可以用默认的javadoc注释的,你只需要将讑֮Ҏoutput for JavaQ?br>
它还可以自定义css/head/footQ由于用于内部交于是就没有讑֮Q可以在Export的HTML选项卡中修改Q传说中MySQL的文就是doxygen生成的。。?br>
doxygen内置了生成类囄功能Q只需要设定Diagram的项?br>
要生成更多图的请下蝲GraphViz?br>
它是一Ƒּ大的可以生成很多U图像的软gQ同样也是开源的Q?a target="_blank">http://www.graphviz.org/?br>
它还提供了Java支持Q有一个纯java~写的子目Grappa。按照上面的说明Q似乎javaE序可以通过Grappa库来实现GraphViz的功能(Grappa调用GraphViz的接口)?br>
大家有兴可以尝试一?挺好玩的说^^
附g是一个Doxygen使用?docxQ里面包含了我这几天玩得doxyWizard的简单用说明?br>
以及 一个用doxyWizard生成的chm文gQ只用了cd、文件包含图和类l承体系图?/p>
]]>
]]>Doxygen是什么?
安装Doxygen
gunzip doxygen-$VERSION.src.tar.gztar xf doxygen-$VERSION.src.tarsh ./configureQ或者configure --platform platform-typeQ略ȝ接用configure需要^台检的q程Q^台类型在PLATFORMS文g中列出)Qconfigure --with-doxywizardQGUI前端选项QmakeQ或者make docsQ创建HTML格式的手册)Qmake pdfQ创建PDF格式的手册)
./configuremake install
Doxygen的处理流E?/h4>
配置文g
注释
JavaDoc风格Q中间的"*"号可选?*** 注释*/Qt风格Q中间的"*"号可选?*!* 注释*/C++风格的变体,或者最后一?/"改ؓ"Q?也可以?// 单行注释/// 注释///更加显著的表C?///////////////////////////////////////////// 注释///////////////////////////////////////////要描qC有多U表C方式。在上述注释块中使用\brief命oQ详l注释在I之后开始?*! \brief 要描q? l箋** 详细注释*/JAVADOC_AUTOBRIEF讄为YES后,在JavaDoc风格的注释中Q第一个点号之前的内容被自动设|ؓ要描q。对于多行C++变体Q这个选项亦会起到相同的作用?** 要描q?详细描述* 注释*/C++变体风格?// 要描q?* 详细描述 */
命o
列表
使用"-"在每行开始之前打_使用"."可以l束一个列表,开始新的段落。用这U方法要严格寚w?*** - 表项一* - 子项一* - 子项? .* .*/在文块中用HTML命o。这U方法不需要严格对齐?*!* <ul>* <li> 表项一* <ol>* <li> 子项一* <li> 子项? </ol>* <li> 表项? </ul>*/
分组
/** * \ingroup A */extern int VarInA;/** * \defgroup IntVariables Global integer variables *//*@{*//** an integer variable */extern int IntegerVariable;/*@}*/..../** * \defgroup Variables Global variables *//*@{*//** a variable in group A */int VarInA;int IntegerVariable;/*@}*/
//@{ ...//@}或?*@{*/ ... /*@}*/
图表
公式
使用\f$命o对表C文本中间的公式Q遵循LaTeX格式。\f$(x_1, y_1)\f$ (x1,y1)位于独立一行上未编L公式Q应攑֜命o\f[和\f]之间。\f[ |I_2|=\left| \psi(t) \right|\f]对应的输出是|I2|=|ψ(t)|?/pre>
中文文档
q行doxygen
]]>
]]>
cd( class diagram ) ?c++ 中的 class ?/p>
聚合( Aggregation ) x们c++中的引用。表Cؓ class 头文件中的一个或多个指针成员?/p>
l合( Composition ) ?c++ 中的成员对象。表Cؓclass 头文件中的一个或多个对象成员。(也可以表Cؓ指针成员Q但需要在cM实例化此对象 Q?/p>
泛化( Generalization ) 即ѝ?/p>
双向兌(Bidirectional Associations) 轻量U的 聚合 ?l合。的即c++中的交叉引用?/font>
依赖Q?nbsp;Dependency ) 从另一个维度表q?l合 ?聚合。即在class A 中?class B的方法或操作 class B 的成员?/span>
用例视图( user case view )、逻辑视图( logical view )、组件视? component view )、部|视? deployment view )?/p>
要了解相关的知识Q可以参?Q?font face=Verdana>UML Distilled > 一?Chapter 3. Class Diagrams: The Essentials ?cdQ基本知? ?Chapter 5. Class Diagrams: Advanced Concepts Q类图:高概念Q?/p>
Q注Q此书中译本叫<UML_aQ,不过译得甚涩,文言文学得不错的可以考虑。繁体版叫<uml _֍Q,赵光正译。熟悉台湾术语的可以考虑??/p>
rose 提供?reserver engineer Q逆向设计Q的功能Q用于将 c++ cL件{化ؓcdQƈ描述cMcM间的关系?nbsp;
?rose 逆向一l?c++ class 的一般步骤是Q?/p>
1、新Z个空白工E?/p>
2、添加一个组Ӟ用于容纳一l类文g?/p>
3、设|?lg属性。指定解?cL件用的插gQ以及逆向出的cM用的包名U?/p>
4、解析,?逻辑视图中的指定? package )中生成相应的cd?/p>
5、将x的类拖到指定的视图中Q观察其l构以及与其它成员的关系?/p>
1、新Z个空白工E。完成后工程信息如下:
图中 untitled 表示q是一个未命名的文档?四个大文件夹分别表示 用例视图、逻辑视图、组件视图、部|视图。每个大文g夹下面有?main l点。这是用来显C视图内容?#8220;桌布”。双Ll点Q便会在ȝ口中打开此桌布。结点可以添加、重命名?/p>
2、新建组Ӟ指定其相兛_性?/p>
在工E的 compnent view (lg视图)l点上单击,选择 new -> component。便创徏了一个新的组件。右键此lgQ选择"open specifition"(属性设|?。在弹出?component Q组件属性)H口?general 选项卡上Q更改其name(名字)属性和 language 属性。name LQ?language 选择 ANSI c++。(默认?analysysQ。点“定”。这里,我们其名称命名?"constol"
3?nbsp;指定相关的类文g?/p>
右键 constol lgQ选择“open ANSI c++ specifition ”Q在出现?nbsp; 属性窗口中 file选项卡中Q更?Reverse engineering root package ,Q默认ؓ c++ reverse Engineered。)名称随意。这里我们改?constol。指?nbsp;project filesQ?nbsp;目文gQ。把要解析的 c++源文仉包含q来。点“定”?/p>
4、回到工E视图。在 component 中的 constol 上,右键Q?#8220;ANSI c++”-> “reverse engineer”Q点“定”。这时会?logical view 下生成一个新的文件夹l点Q结点名UCؓ 我们在第3步中 Reverse engineering root package 中ȝ内容。结点下面包含了由源代码中解析出的类?/p>
5、在 logical view 中,双击 main l点。便打开了一?main 逻辑视图。挨个把 logical view -> constol l点?nbsp;的所有类l点拖到 main 视图中。则cȝ成员、类的关pM在视图中昄出来?/p>
二、逆向工程操作程
1.点击Tools->Java/J2ee->Reverse EngineerQ调出Java Reverse Engineer对话框?nbsp;
2、在此页面添加要q行逆向工程的Java文gQƈ选中Q然后点击Reverse按钮卛_?nbsp;
3、关于逆向工程的一点说明?nbsp;
逆向工程操作更ؓ单,试验q行逆向工程主要是看代码开发完q行逆向同步设计会不会出问题Q以及信息会不会丢失Q已l用物h查询模块的代码进行了逆向工程的测试,基本W合我们目的要求,有两炚w要注意一?nbsp;
1Q?q行逆向Ӟ若有兌的类Q包括我们框架的cL别的模块的类Q不存在Q则逆向会报错,无法q行
本文来自CSDN博客Q{载请标明出处Q?a >http://blog.csdn.net/wangyi1015/archive/2009/06/04/4241897.aspx