linux libev 和 libevent 安装,生成doxygen帮助文档

编译,安装,使用

请参考[静态库 与 动态库](http://www.cnblogs.com/scotth/p/3977928.html)

 

移植libev事件库到Android中  http://blog.csdn.net/yph007595/article/details/45166979

libev用法 http://www.yeolar.com/note/2012/12/16/libev/

 

 

1.libev

下载 [libev-4.20.tar.gz](http://dist.schmorp.de/libev/Attic/libev-4.20.tar.gz)

libev 的文档 http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod

 

解压文件:

gzip -d libev-4.20.tar.gz

tar zxvf libev-4.20.tar

 

安装libev:

进入目录后

 sh autogen.sh

  ./configure && make

  sudo make install

 

 之后此目录下 会创建【.lib】目录,会生成  *.a(静态库),    *.so(动态库)

 

 

验证安装:

查看环境变量 env

ls -al /usr/lib |grep libev

ls -al /usr/local/lib |grep libev  (若你没有指定安装目录,则默认是/usr/local/lib 路径)

 

 

 

 

编译demo时链接libev

```c

 // a single header file is required
   #include <ev.h>

   #include <stdio.h> // for puts

   // every watcher type has its own typedef'd struct
   // with the name ev_TYPE
   ev_io stdin_watcher;
   ev_timer timeout_watcher;

   // all watcher callbacks have a similar signature
   // this callback is called when data is readable on stdin
   static void
   stdin_cb (EV_P_ ev_io *w, int revents)
   {
     puts ("stdin ready");
     // for one-shot events, one must manually stop the watcher
     // with its corresponding stop function.
     ev_io_stop (EV_A_ w);

     // this causes all nested ev_run's to stop iterating
     ev_break (EV_A_ EVBREAK_ALL);
   }

   // another callback, this time for a time-out
   static void
   timeout_cb (EV_P_ ev_timer *w, int revents)
   {
     puts ("timeout");
     // this causes the innermost ev_run to stop iterating
     ev_break (EV_A_ EVBREAK_ONE);
   }

   int
   main (void)
   {
     // use the default event loop unless you have special needs
     struct ev_loop *loop = EV_DEFAULT;

     // initialise an io watcher, then start it
     // this one will watch for stdin to become readable
     ev_io_init (&stdin_watcher, stdin_cb, /*STDIN_FILENO*/ 0, EV_READ);
     ev_io_start (loop, &stdin_watcher);

     // initialise a timer watcher, then start it
     // simple non-repeating 5.5 second timeout
     ev_timer_init (&timeout_watcher, timeout_cb, 5.5, 0.);
     ev_timer_start (loop, &timeout_watcher);

     // now wait for events to arrive
     ev_run (loop, 0);

     // break was called, so exit
     return 0;
   }

```

 

`gcc -o main main.c -lev`就可以了

 

 

 

必须指定库的路径,因为gcc对库的搜寻顺序为:
gcc会先找-L,再找gcc的环境变量LIBRARY_PATH,再找/lib:/usr/lib: /usr/local/lib
$ gcc -o testlibev -L/usr/local/lib -lev main.c
编译通过。

 

 

运行./main 还是提示
./main: error while loading shared libraries: libev.so.4: cannot open shared object file: No such file or directory

看来,运行时 还是要我们自己把动态库加进来, 要不然就放到系统目录, 文章的开头有[动态库 静态库]传送门。

 

找不到libev.so.4动态库加载。
动态库查找顺序和路径:
1.在编译目标代码时指定该程序的动态库搜索路径(还可以在编译目标代码时指定程序的动态库搜索路径)。这是通过gcc 的参数”-Wl,-rpath,”指定。当指定多个动态库搜索路径时,路径之间用冒号”:”分隔;
2.通过环境变量LD_LIBRARY_PATH指定动态库搜索路径(多个用:隔开);
3.在配置文件/etc/ld.so.conf中指定动态库搜索路径;(换行 加入 `include /usr/local/lib`) 然后 sudo ldconfig 让配置生效
4.默认的动态库搜索路径/lib    /usr/lib
设置动态库查找路径:
$ export LD_LIBRARY_PATH=/usr/local/lib

 

 

 

搞定

 

 

Tips:

1.之前我一直以为命令是 gcc -o main main.c -llibev 错误,可以尝试删去libev 的lib,用gcc -o main main.c -lev

2.虽然省略了 【库的路径】 和 【库名字 .so .a】

但是还是最好写上去

gcc -o main main.c -L/usr/local/lib /usr/local/lib/libev.a   //链接静态库

gcc -o main main.c -L/usr/local/lib /usr/local/lib/libev.so  //链接动态库

 

 

 

 ------------------

 

 

2.libevent 安装

下载libevent-2.0.21-stable.tar.gz (若是失效 在这里找新版本 http://libevent.org/

 

PS.以下安装说明在README中有说明,参照README吧

 

解压 tar -zxvf libevent-2.0.21-stable.tar.gz

 

设置安装目录,

     ./configure –prefix=/usr (或 ./configure --program-prefix=/usr      ubuntu 14.04下,我的目录是./configure –prefix=/usr/local  )

     make && make install

接下来可以在/usr/local找到安装的lib, include头文件什么的了

 

 也可以直接 

./configure

sudo make

sudo make install

===========================

查看环境变量 env

 

验证安装

ls -al /usr/lib |grep libevent

ls -al /usr/local/lib |grep libevent  (若你没有指定安装目录,则默认是/usr/local/lib 路径)

 

 

 


 

 

 

2.生成文档

1>

 

首先如果要用autogen.sh来生成文档,

 

安装autogen   sudo apt-get install autogen

./autogen.sh

 

 

2>

安装doxygen   sudo apt-get install doxygen

生成doxyfile    doxygen -g

Libevent中有doxyfile 此文件,所以直接 doxygen doxyfile

                            ./doxygen 目录下就可以看到 ./html 和 ./latex 文件了, 查看./html/index.html就可以OK

 还有latex 生成pdf文档

 

latex文件夹中看到Makefile   有用到pdflatex  refman

所以需要安装latex sudo apt-get install texlive-latex-base

然后cd latex

make

(libevent的latex 生成pdf还是有点问题,       先看html吧)

 

关于doxygen 更多信息 http://www.cppblog.com/toMyself/archive/2010/12/01/135184.html

 

Doxygen
Posted on 2010-12-01 19:30 kongkongzi 阅读(1342) 评论(0)  编辑 收藏 引用 所属分类: tools
1.1 要做什么

使用Doxygen生成文档,主要是两件事:

   1. 写一个配置文件(Doxyfile)。一般用Doxywizard生成后,再手工修改。
   2. 按照Doxygen的约定,将代码“文档化”。

然后只要执行命令:
doxygen Doxyfile

就可以了。输入文件、输出目录、参数等都是在Doxyfile中配置的。
1.2 得到什么

Doxygen的输出格式主要有HTML、LATEX、RTF等:

    * Doxygen在输出HTML文档时,可以自动准备用于制作CHM的项目文件(.hhp)、目录文件(.hhc)和索引文件(.hhk)。用HTML Help Workshop中的CHM编译器(hhc.exe)编译后生成CHM文件。
    * Doxygen在输出LATEX文档的同时准备了转换到pdf格式的makefile。只要系统安装了合适的TEX工具,就可以从LATEX文档生成pdf文档。
    * Doxygen输出的RTF格式,已经针对Word作了优化,可以较好地转换到Word文档。



doxygen 使用简介(C,C++为代码作注释): http://www.cnblogs.com/wishma/archive/2008/07/24/1250339.html


2. doxygen配置文件
doxygen配置文件的格式是也是通常的unix下配置文件的格式:注释'#'开始;tag = value [,value2…];对于多值的情况可以使用 tag += value [,value2…]。

对doxygen的配置文件的修改分为两类:一种就是输出选项,控制如何解释源代码、如何输出;一种就是项目相关的信息,比如项目名称、源代码目录、输出文档目录等。对于第一种设置好后,通常所有项目可以共用一份配置,而后一种是每个项目必须设置的。下面选择重要的,有可能需要修改的选项进行解释说明,其他选项在配置文件都有详细解释。

TAG 缺省值 含义
PROJECT_NAME 项目名称
PROJECT_NUMBER 可以理解为版本信息
OUTPUT_DIRECTORY 输出文件到的目录,相对目录(doxygen运行目录)或者绝对目录
INPUT 代码文件或者代码所在目录,使用空格分割
FILE_PATTERNS *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp *.h++ *.idl *.odl 指定INPUT的目录中特定文件,如:*.cpp *.c *.h
RECURSIVE NO 是否递归INPUT中目录的子目录
EXCLUDE 在INPUT目录中需要忽略的子目录
EXCLUDE_PATTERNS 明确指定的在INPUT目录中需要忽略的文件,如:FromOut*.cpp

OUTPUT_LANGUAGE English 生成文档的语言,当前支持2、30种语言,国内用户可以设置为Chinese
USE_WINDOWS_ENCODING YES(win版本)
NO(unix版本) 编码格式,默认即可。
EXTRACT_ALL NO 为NO,只解释有doxygen格式注释的代码;为YES,解析所有代码,即使没有注释。类的私有成员和所有的静态项由EXTRACT_PRIVATE和 EXTRACT_STATIC控制
EXTRACT_PRIVATE NO 是否解析类的私有成员
EXTRACT_STATIC NO 是否解析静态项
EXTRACT_LOCAL_CLASSES YES 是否解析源文件(cpp文件)中定义的类
SOURCE_BROWSER NO 如果为YES,源代码文件会被包含在文档中
INLINE_SOURCES NO 如果为YES,函数和类的实现代码被包含在文档中
ALPHABETICAL_INDEX NO 生成一个字母序的列表,有很多类、结构等项时建议设为YES
GENERATE_HTML YES 是否生成HTML格式文档
GENERATE_HTMLHELP NO 是否生成压缩HTML格式文档(.chm)
GENERATE_LATEX YES 是否乘车latex格式的文档
GENERATE_RTF NO 是否生成RTF格式的文档
GENERATE_MAN NO 是否生成man格式文档
GENERATE_XML NO 是否生成XML格式文档

3. doxygen注释
3.1 注释风格
下面是工作量最大部分,安装doxygen格式写注释。通常代码可以附上一个注释块来对代码进行解释,一个注释块由一行或者多行组成。通常一个注释块包括一个简要说明(brief)和一个详细说明(detailed),这两部分都是可选的。可以有多种方式标识出doxygen可识别的注释块。
1)JavaDoc类型的多行注释。

2)QT样式的多行注释。

3) /// …text….
4) //! …text….
简要说明有多种方式标识,这里推荐使用@brief命令强制说明,例如:

以上这些注释格式用来对紧跟其后的代码进行注释。doxygen也允许把注释放到代码后面,具体格式是放一个'<'到注释开始部分。例如:
int var1 ;
int var2; ///< ….text….

注释和代码完全分离,放在其他地方也是允许的,但需要使用特殊的命令加上名称或者声明进行标识,比如:class、struct、union、 enum、fn、var、def、file、namespace、package、interface(这些也就是doxygen关注的注释类型)。这里不推荐使用,建议注释尽量放在代码前后。具体使用方式参见doxygen手册。

3.2 doxygen常用注释格式
通常的选择上面的一、两种注释风格,遇到头文件中各种类型定义,关键变量、宏的定义,在其前或者后使用 @brief 定义其简要说明,空一行后继续写其详细的注释即可。

对函数的注释,是比较常常需要注释的部分。除了定义其简要说明以及详细注释,还可以使用param命令对其各个参数进行注释,使用return命令对返回值进行注释。常见的格式如下:

int func1(int a, int b);

进行设计时,通常有模块的概念,一个模块可能有多个类或者函数组成,完成某个特定功能的代码的集合。如何对这个概念进行注释?doxygen提供了group的概念,生成的模块的注释会单独放在一个模块的页面中。使用下面的格式定义一个group。

code

group中的代码可以有自己的注释。单纯定义一个模块,去除{ 和}命令即可。任何其他代码项(比如类、函数、甚至文件)如果要加入到某个模块,可以在其doxygen注释中使用ingroup命令即可。Group之间使用ingroup命令,可以组成树状关系。

把多个代码项一起添加到某个模块中可以使用addtogroup命令,格式和defgroup相似。

对于某几个功能类似的代码项(比如类、函数、变量)等,如果希望一起添加注释,而又不想提升到模块的概念,可以通过下面的方式:
//@{

code…
//@}
对这种组进行命名可以使用name命令。此时中间代码可以有自己的注释。如:

//@{
code…
//@}

3.3 doxygen常用注释命令
doxygen通过注释命令识别注释中需要特殊处理的注释,比如函数的参数、返回值进行突出显示。上面也提到了一些注释命令(如:brief、param、return、以及group相关的命令),下面对其他一些常用的注释命令进行解释说明。
@exception <exception-object> {exception description} 对一个异常对象进行注释。
@warning {warning message } 一些需要注意的事情
@todo { things to be done } 对将要做的事情进行注释
@see {comment with reference to other items } 一段包含其他部分引用的注释,中间包含对其他代码项的名称,自动产生对其的引用链接。
@relates <name> 通常用做把非成员函数的注释文档包含在类的说明文档中。
@since {text} 通常用来说明从什么版本、时间写此部分代码。
@deprecated
@pre { description of the precondition } 用来说明代码项的前提条件。
@post { description of the postcondition } 用来说明代码项之后的使用条件。
@code 在注释中开始说明一段代码,直到@endcode命令。
@endcode 注释中代码段的结束。

到此为止,常用的doxygen的注释格式讨论完毕,我们能够按照一定的格式撰写doxygen认识的注释,并能够使用doxygen方便快捷的生成对应的文档,不过注释中应该写些什么,如何撰写有效的注释可能是困扰开发人员的一个更深层次的问题。

4. 注释的书写
注释应该怎么写,写多还是写少。过多的注释甚至会干扰对代码的阅读。写注释的一个总的原则就是注释应该尽量用来表明作者的意图,至少也应该是对一部分代码的总结,而不应该是对代码的重复或者解释。对代码的重复或者解释的代码,看代码可能更容易理解。反映作者意图的注释解释代码的目的,从解决问题的层次上进行注释,而代码总结性注释则是从问题的解答的层次上进行注释。

推荐的写注释的过程是首先使用注释勾勒出代码的主要框架,然后根据注释撰写相应的代码。对各种主要的数据结构、输出的函数、多个函数公用的变量进行详细地注释。对代码中控制结构,单一目的的语句集进行注释。下面是一些写注释时需要注意的要点:
避免对单独语句进行注释;
通过注释解释为什么这么做、或者要做什么,使代码的读者可以只阅读注释理解代码;
对读者可能会有疑问的地方进行注释;
对数据定义进行注释,而不是对其使用过程进行注释;
对于难于理解的代码,进行改写,而不要试图通过注释加以说明;
对关键的控制结构进行注释;
对数据和函数的边界、使用前提等进行注释;

5. 参考资料
1. doxygen homepage
http://www.stack.nl/~dimitri/doxygen/

2. doxygen manual
http://www.stack.nl/~dimitri/doxygen/manual.html

3. Code Complete: A Practical Handbook of Software Construction. Redmond, Wa.: Microsoft Press, 880 pages, 1993. ISBN: 1-55615-484-4.

4. 简介doxygen
http://www.stack.nl/~dimitri/doxygen/doxygen_intro_cn.html

5. 10 Minutes to document your code
http://www.codeproject.com/tips/doxysetup.asp

6. 使用doxygen
http://www.csdn.net/Develop/article/16%5C16383.shtm




类似于由C风格的注释块: /**
* ... 文本 ...
*/

此外您也可以使用Qt风格,如
/*!
* ... 文本...
*/

以上两种风格中间的*是可选的,也就是下面这样写也是可以的:
/*!
... 文本...
*/

第三种是使用至少两行C++"//"注释,如:
///
/// ... 文本...
///

或者

//!
//!...文本...
//!



//!简洁描述信息
//! 详细描述信息
/*! 注意,又一详细描述信息!
*/ 下例使用Qt风格的文档标注:
//! A test class.
/*!
A more elaborate class description.
*/

class Test
{
public:

//! An enum.
/*! More detailed enum description. */
enum TEnum {
TVal1, /*!< Enum value TVal1. */
TVal2, /*!< Enum value TVal2. */
TVal3 /*!< Enum value TVal3. */
}
//! Enum pointer.
/*! Details. */
*enumPtr,
//! Enum variable.
/*! Details. */
enumVar;

//! A constructor.
/*!
A more elaborate description of the constructor.
*/
Test();

//! A destructor.
/*!
A more elaborate description of the destructor.
*/
~Test();

//! A normal member taking two arguments and returning an integer value.
/*!
\param a an integer argument.
\param s a constant character pointer.
\return The test results
\sa Test(), ~Test(), testMeToo() and publicVar()
*/
int testMe(int a,const char *s);

//! A pure virtual member.
/*!
\sa testMe()
\param c1 the first argument.
\param c2 the second argument.
*/
virtual void testMeToo(char c1,char c2) = 0;

//! A public variable.
/*!
Details.
*/
int publicVar;

//! A function variable.
/*!
Details.
*/
int (*handler)(int a,int b);
};
  Doxygen的文档标注是不是非常容易?当然还可以有更高级的应用,如标注列表、分组,甚至支持生成公式(Latex)。上面只编译了最简单的一些使用方法,更多内容请参考Doxygen的帮助文档doxygen_manual。

附带文档的说明:

  DoxygWizard是基于QT的简易图形用户界面,简化了Doxygen的使用。您可以在DoxygWizard里对需要生成的文档进行设置,可保存为"Doxyfile",然后调用Doxygen生成文档。需要注意的是,文件路径不支持中文,所以尽可能使您的源代码和文档目录均为英文名。在 "Doxyfile"文件同一目录请放置一个"mylogo"纯文本文件,内容可以是一些版权标识信息,这些信息将显示在生成文档页面的最下边,如果没有此"mylogo"文件,将生成默认的版权标识信息。
  样式表文件Orignl_doxygen.css、green_doxygen.css、yellow_doxygen.css、 Blue_doxygen.css,改文件名为doxygen.css后,拷贝到生成html文档的目录内可以改变文档显示的样式。
  OUT PUT_LANGUAGE 可选项为Englisth(英文文档), Chinese(中文文档), En_Can_Cn(支持中文注释的英文文档)



实例参考:
下载doxygen的源代码包,里面有一个examples目录,在这里有很多注释代码例子和对应的doxygen配置文件(Doxyfile)。


mydoxy.cfg
PROJECT_NAME     = "My Project"
PROJECT_NUMBER     = 1.01
OUTPUT_DIRECTORY = projdoc
INPUT            = ./src/
FILE_PATTERNS     = *.c *.cc *.cxx *.cpp *.c++ *.h *.hh *.hxx *.hpp *.h++
RECURSIVE         = YES
OUTPUT_LANGUAGE     = English
EXTRACT_ALL         = YES
EXTRACT_PRIVATE     = YES
EXTRACT_STATIC     = YES
SOURCE_BROWSER     = YES
INLINE_SOURCES     = YES
ALPHABETICAL_INDEX = YES
GENERATE_HTML     = YES
GENERATE_LATEX   = NO
GENERATE_MAN     = NO
GENERATE_RTF     = NO
GENERATE_XML     = NO
CASE_SENSE_NAMES = NO
QUIET            = YES
JAVADOC_AUTOBRIEF = YES
SEARCHENGINE     = NO


Doxygen Manual
1, http://www.stack.nl/~dimitri/doxygen/manual.html
2, http://www.doxygen.nl/manual.html


Use doxygen to generate a template configuration file:

              doxygen [-s] -g [configName]

              If - is used for configName doxygen will write to standard output.


DOXYTAG(1)                                                                          User Commands                                                                          DOXYTAG(1)

NAME
       doxytag - generates a tag file and/or a search index for a set of HTML files

SYNOPSIS
       doxytag [-t tag_file] [-s index_file] [ html_file [html_file...] ]

DESCRIPTION
       Generates a tag file and/or a search index for a set of HTML files.  Use doxysearch as a CGI program to search the tag file generated by doxytag.

OPTIONS
       -t <tag_file>
              Generate tag file <tag_file>.

       -s <index_file>
              Generate search index <index_file>.

       If no HTML files are given all files in the current dir that have a .html extension are parsed.
doxygen 说明信息

 

PS.

    libevent-master源码中也可以用doxygen生成文档。这样看代码结构会舒服很多。

 

还有官方document

https://github.com/nmathewson/libevent-book

生成html pdf 需要安装 sudo apt-get install asciidoc

然后sudo make

如果想生成pdf sudo make pdf

详细看makefile

 

 

http://www.wangafu.net/~nickm/libevent-book/

 

 

 

3.文件、文件夹可以 以【树状图】显示

sudo apt-get install tree

cd 某目录 , 直接tree

 

4.

posted @ 2014-10-09 17:55  scott_h  阅读(717)  评论(0编辑  收藏  举报