編譯,安裝,使用 css
請參考[靜態庫 與 動態庫](http://www.cnblogs.com/scotth/p/3977928.html)html
移植libev事件庫到Android中 http://blog.csdn.net/yph007595/article/details/45166979java
libev用法 http://www.yeolar.com/note/2012/12/16/libev/c++
1.libevgit
下載 [libev-4.20.tar.gz](http://dist.schmorp.de/libev/Attic/libev-4.20.tar.gz)github
libev 的文檔 http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.podubuntu
解壓文件:數組
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 生成文檔的語言,當前支持二、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經常使用註釋格式 一般的選擇上面的1、兩種註釋風格,遇到頭文件中各類類型定義,關鍵變量、宏的定義,在其前或者後使用 @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.
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.