libevent官網:https://libevent.org/html
GitHub-libevent項目連接:https://github.com/libevent/libeventgit
要獲取libevent源碼包,能夠在上面兩個網址連接上獲取到。本人下載的是libevent-2.1.8-stable版本,源碼包文件名爲:libevent-2.1.8-stable.tar.gz。github
《注意》安裝須要有root權限,最好是在root用戶下進行,若是不是root用戶,執行編譯安裝操做時須要在命令前加上 sudo 。本人是在root用戶下進行操做的。vim
1、解壓縮源碼包。centos
tar -xzvf libevent-2.1.8-stable.tar.gz
2、進入libevent-2.1.8-stable目錄,執行 configure 配置腳本bash
一、查看configure 腳本的使用幫助及其選項,能夠執行命令:./configure --help 查看。多線程
若是直接執行:./configure,那麼默認安裝路徑是/usr/local,對應的頭文件、可執行文件和庫文件分別對應的目錄是:'/usr/local/include'、'/usr/local/bin','/usr/local/lib'。工具
二、我本人設置了自定義安裝路徑,執行命令以下:post
./configure --prefix=/usr/local/libevent
三、第2步執行成功後,會生成Makefile文件,而後使用make命令進行源碼編譯。網站
make
四、編譯成功後,執行安裝命令。
make install
五、進入/usr/local目錄下,能夠看到一個libevent目錄,查看下這個目錄的樹形結構。
[root@centos7 local]# tree -L 3 libevent/
libevent/
├── bin
│ └── event_rpcgen.py
├── include
│ ├── evdns.h
│ ├── event2
│ │ ├── buffer_compat.h
│ │ ├── bufferevent_compat.h
│ │ ├── bufferevent.h
│ │ ├── bufferevent_ssl.h
│ │ ├── bufferevent_struct.h
│ │ ├── buffer.h
│ │ ├── dns_compat.h
│ │ ├── dns.h
│ │ ├── dns_struct.h
│ │ ├── event_compat.h
│ │ ├── event-config.h
│ │ ├── event.h
│ │ ├── event_struct.h
│ │ ├── http_compat.h
│ │ ├── http.h
│ │ ├── http_struct.h
│ │ ├── keyvalq_struct.h
│ │ ├── listener.h
│ │ ├── rpc_compat.h
│ │ ├── rpc.h
│ │ ├── rpc_struct.h
│ │ ├── tag_compat.h
│ │ ├── tag.h
│ │ ├── thread.h
│ │ ├── util.h
│ │ └── visibility.h
│ ├── event.h
│ ├── evhttp.h
│ ├── evrpc.h
│ └── evutil.h
└── lib
├── libevent-2.1.so.6 -> libevent-2.1.so.6.0.2
├── libevent-2.1.so.6.0.2
├── libevent.a
├── libevent_core-2.1.so.6 -> libevent_core-2.1.so.6.0.2
├── libevent_core-2.1.so.6.0.2
├── libevent_core.a
├── libevent_core.la
├── libevent_core.so -> libevent_core-2.1.so.6.0.2
├── libevent_extra-2.1.so.6 -> libevent_extra-2.1.so.6.0.2
├── libevent_extra-2.1.so.6.0.2
├── libevent_extra.a
├── libevent_extra.la
├── libevent_extra.so -> libevent_extra-2.1.so.6.0.2
├── libevent.la
├── libevent_pthreads-2.1.so.6 -> libevent_pthreads-2.1.so.6.0.2
├── libevent_pthreads-2.1.so.6.0.2
├── libevent_pthreads.a
├── libevent_pthreads.la
├── libevent_pthreads.so -> libevent_pthreads-2.1.so.6.0.2
├── libevent.so -> libevent-2.1.so.6.0.2
└── pkgconfig
├── libevent_core.pc
├── libevent_extra.pc
├── libevent.pc
└── libevent_pthreads.pc
5 directories, 56 files
能夠看到libevent目錄下有3個一級子目錄:bin/,include/ 和 lib。下面分別做簡要的介紹:
bin/:這個目錄下存放的是可執行文件,能夠看到是一個event_rpcgen.py腳本文件,具體功能是什麼目前還不清楚。
include/:這個目錄下存放的是libevent三方庫的頭文件,它下面還有個子目錄:event2/,存放的是支持libevent-2.x版本的頭文件,以示區別libevent-1.x版本。由於libevent-1.x版本和libevent-2.x版本的變化有點大,爲了向下兼容低版本的libevent,因此添加了event2這個子目錄。當在程序中要用到libevent-2.x版本的某些頭文件時,使用#include宏命令包含頭文件的方式,舉例以下:
#include <event2/bufferevent.h>
#include <event2/buffer.h>
#include <event2/listener.h>
#include <event2/util.h>
#include <event2/event.h>
#include <event2/thread.h>
lib/:lib目錄存放的是libevent的庫文件,包括靜態庫、動態庫文件等文件。lib目錄下還有一個子目錄pkgconfig/,該子目錄下的xxx.pc文件用於pkg-config工具的使用,具體用法這裏不做說明了,這個工具能夠幫助程序的源碼編譯工做。對應的環境變量是PKG_CONFIG_PATH,經過配置這個環境變量,在編譯的時候編譯器就能夠找到所依賴的頭文件和庫文件。配置方法會在下面說明。pkgconfig目錄下有4個.pc文件,這四個.pc文件對應着4個libevent庫模塊。
libevent_core.pc # libevent核心模塊
libevent_extra.pc # libevent擴展模塊
libevent.pc # libevent基礎模塊
libevent_pthreads.pc # libevent多線程模塊
查看其中一個.pc文件的內容,# more libevent_core.pc
#libevent pkg-config source file prefix=/usr/local/libevent exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: libevent_core Description: libevent_core Version: 2.1.8-stable Requires: Conflicts: Libs: -L${libdir} -levent_core Libs.private: Cflags: -I${includedir}
至此,libevent-2.1.8三方庫安裝成功了。可是,要使用libevent庫進行應用程序的開發工做,還須要配置libevent三方庫的開發環境。
這裏,我只說明最多見的配置三方庫的使用環境,即經過配置相關環境變量的方式。具體方法是:在當前用戶的home目錄下的.bashrc 或者 .bash_profile配置文件中配置libevent庫的使用環境。本人是在 .bash_profile 文件下配置相關環境變量的值的。
一、配置C語言頭文件的搜索路徑,對應的環境變量是C_INCLUDE_PATH ,C++頭文件的環境變量是CPLUS_INCLUDE_PATH。
]$ vim ~/.bash_profile #添加內容以下:
#Add C header file path
export C_INCLUDE_PATH=/usr/local/libevent/include:$C_INCLUDE_PATH
保存成功後,執行:source ~/.bash_profile,令修改生效,下同。查看C_INCLUDE_PATH 環境變量的值:echo $C_INCLUDE_PATH
二、配置庫文件的搜索路徑,對應的環境變量是:LIBRARY_PATH、LD_LIBRARY_PATH。添加內容以下:
# Add third_lib path
export LD_LIBRARY_PATH=/usr/local/libevent/lib:$LD_LIBRARY_PATH
export LIBRARY_PATH=/usr/local/libevent/lib:$LIBRARY_PATH
可能有人要問了,爲何 LD_LIBRARY_PATH、LIBRARY_PATH 配置的值是同樣的,是否是畫蛇添足呢?這裏我解釋一下,以前我在安裝ZeroMQ三方庫的時候,只配置了LD_LIBRARY_PATH這一個環境變量,可是在編譯的時候仍然報了錯誤,錯誤描述信息以下:
/usr/bin/ld: cannot find -lzmq
collect2: error: ld returned 1 exit status
後來,我去技術問答網站尋求幫助,發現還須要配置 LIBRARY_PATH 這個環境變量,配置了這個環境變量以後,編譯就經過了。這兩個環境變量仍是有所區別的,所以建議都加上。
三、嘗試編譯一個libevent程序,源文件名爲:libevent_version.c,源碼以下:
#include <stdio.h>
#include <event.h>
int main()
{
printf("The current libevent version is %s\n",event_get_version());
return 0;
}
編譯命令: gcc libevent_version.c -o libevent_version -levent
運行結果:The current libevent version is 2.1.8-stable
<分析> 能夠看到,編譯運行經過了,所以咱們的libevent三方庫的使用環境設置是沒有問題的。
【參考】
環境變量:LIBRARY_PATH 和 LD_LIBRARY_PATH的區別
在編寫多文件項目或者大型項目的軟件開發時,咱們編譯整個項目通常都是經過編寫Makefile文件,使用make命令來編譯的。在GCC編譯階段須要包含#include宏指令指定的頭文件,在連接階段又須要鏈接相應的庫文件,因爲頭文件的搜索路徑和庫文件的搜索路徑是相互獨立的,這就可能帶來一個問題:頭文件搜索路徑下的頭文件和庫文件搜索路徑下的庫文件可能不是對應同一個三方庫的版本。好比說,頭文件搜索路徑下的頭文件是libevent-1.14.14b版本的,而庫文件搜索路徑下的庫文件是libevent-2.1.8版本的,這就帶來了版本的不一致性了,在編譯的時候可能會報錯,或者說編譯能夠經過,可是在程序運行時可能會出現意想不到的錯誤,這就比較嚴重了,而且你還很差查錯。
pkg-config工具正好能夠解決上面遇到的編譯連接不統一的問題。它的工做原理這裏我就不做說明了,下面具體說明如何配置和使用pkg-config工具。以libevent爲例來講明。
一、要使用pkg-config工具來設置三方庫的搜索路徑,須要配置一個環境變量PKG_CONFIG_PATH,配置值是xxx.pc文件的絕對路徑。
]$ vim ~/.bash_profile
#Add pkg-config path
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
我這裏使用的xxx.pc文件的路徑是:/usr/local/lib/pkgconfig,這個路徑是能夠自定義的。修改保存後,執行:source ~/.bash_profile,令修改生效。
二、上文中咱們提到,libevent的安裝路徑下的bin/pkgconfig目錄下有4個.pc文件,咱們將這4個.pc文件複製到配置路徑下。
]# cd /usr/local/libevent/lib/pkgconfig/;ls
libevent_core.pc libevent_extra.pc libevent.pc libevent_pthreads.pc
]# cp *.pc /usr/local/lib/pkgconfig
三、配置完成後,咱們使用pkg-config 的方式來編譯一下libevent_version.c這個源程序,編譯命令以下:
gcc `pkg-config --cflags --libs libevent` libevent_version.c -o libevent_version
<說明> --cflags 參數,能夠給出編譯時所需的頭文件搜索路徑。--libs 參數,能夠給出編譯時所需的庫文件搜索路徑。libevent 對應的是 /usr/local/lib/pkgconfig目錄下的libevent.pc文件。同時,能夠注意到咱們的編譯命令並無加 -levent 參數,可是加上也無妨。
<Tips> 建議在編寫Makefile文件中,使用 pkg-config 的方式來設置三方庫的開發環境,這樣能夠減小和規避潛在的開發風險。
【參考】
簡述configure、pkg-config、pkg_config_path三者的關係
至此,libevent-2.1.8三方庫的源碼安裝和開發環境配置就完成了,接下來就可使用libevent庫來進行應用程序的開發工做了。