天天看點

Libevent 學習一:Libevent 源碼編譯Libevent 學習一:Libevent 源碼編譯

文章目錄

  • Libevent 學習一:Libevent 源碼編譯
    • Libevent Windows 編譯
      • Windows 編譯環境
      • 安裝 Visual Studio Community 2015
      • 安裝 zlib
      • 安裝 OpenSSL
      • 安裝 Libevent
      • cmake 安裝 Libevent
      • Libevent 測試程式
    • Libevent Linux編譯
      • CentOS 7 安裝 Libevent
      • Libevent 測試程式

Libevent 學習一:Libevent 源碼編譯

Libevent Windows 編譯

Windows 編譯環境

在 Win 10 上編譯 Libevent 需要準備如下工具:

  1. Visual Studio ,最好是 2015 以上的版本,可以支援 C++11 ,免費的社群版就很好用;
  2. Perl 和 nasm ,編譯 OpenSSL 的工具,Perl 用于生成 Makefile 檔案,nasm 用于編譯 OpenSSL 中的彙編代碼;
  3. zlib ,Libevent 本身不需要 zlib 庫,但是測試程式需要,Libevent 可以很友善地使用 zlib 庫處理壓縮和解壓縮資料;
  4. OpenSSL ,大名鼎鼎的開源安全工具集,實作了 SSL 協定,包括 SSLv2、SSLv3 和 TLSv1,提供了大量的加解密算法和數字證書編解碼等算法,是安全領域必不可少的工具。Libevent 可依賴 OpenSSL 提供安全的資料傳輸,當然,也可以通過設定去除這個依賴。

這裡使用的工具版本如下:

  • Visual Studio Community 2015
  • strawberry-perl-5.24.1.1-64bit-portable
  • nasm-2.15.05
  • zlib-1.2.11
  • openssl-1.1.1
  • libevent-2.1.12-stable

這些工具都可以在網上進行自由下載下傳,下面從簡單入手,對這些工具的安裝和使用進行逐一講解。這裡先事先說明一點,這些程式最好不要安裝在帶空格的目錄中,否則後期編譯會報錯 ,當然也會有解決辦法。

安裝 Visual Studio Community 2015

Visual Studio Community 2015 的安裝比較簡單,可用直接從 Microsoft 官網 下載下傳安裝包,一路點選 “下一步” 進行安裝即可。另外,使用者需要先注冊一個賬号才能下載下傳安裝包。截止到目前為止,Microsoft 推出的最新版本為 Visual Studio 2022 。

安裝 zlib

直接從 zlib 官網 下載下傳最新的源碼,目前最新版本為 zlib-1.2.11 。下載下傳完成後按照以下步驟可完成安裝:

  • 解壓 zlib-1.2.11
  • 調出 VS2015 中的 VS2015 x64 本機工具指令提示符
  • 進入 zlib-1.2.11 目錄中執行

    nmake /f win32\Makefile.msc

編譯完成後需要自行拷貝頭檔案、庫檔案和可執行程式到安裝目錄中。為了省事,完全可以寫一個批處理腳本檔案 build_zlib_vs2015_64.bat ,檔案内容如下:

set VS="C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"
set INSTALL="build_release"

@rem 調用 VS 環境
call %VS%

@rem 進入 zlib 目錄中進行編譯
cd zlib-1.2.11
nmake /f win32\Makefile.msc clean
nmake /f win32\Makefile.msc

@rem 拷貝編譯後的檔案
md %INSTALL%\bin
md %INSTALL%\lib
md %INSTALL%\include
copy /Y *.dll %INSTALL%\bin
copy /Y *.exe %INSTALL%\bin
copy /Y *.lib %INSTALL%\lib
copy /Y *.h %INSTALL%\include

@rem 顯示編譯結束
pause
           

然後直接輕按兩下運作,就将 zlib 編譯完成,并自動将頭檔案、庫檔案和可執行程式拷貝到安裝目錄 INATALL 中。

注意,在VS中調用靜态庫 zlib.lib 時會提示警告:warning LNK4099: PDB ‘zlib.pdb’ … ,這是因為程式預設調試 zlib 開源庫,需要 pdb 檔案。不需要理會,直接忽視該警告即可,或者直接使用動态庫 zdll.lib / zlib1.dll。

安裝 OpenSSL

要安裝 OpenSSL ,需要先安裝 Perl 和 nasm,Perl 用于生成 Makefile 檔案,nasm 用于編譯 OpenSSL 中的彙編代碼。

安裝 Perl 編譯器

直接去 Perl 官網 下載下傳編譯器,在 Window 平台上有 ActiveStatePerl 和 Strawberry Perl 兩個版本的編譯器。ActiveState Perl 和 Strawberry Perl 最大的差別是後者中多包含一些 CPAN 裡的子產品, 是以Strawberry Perl 下載下傳的安裝檔案要大一些,有 80MB 左右, 而 ActiveState Perl 隻有 20M 左右。

想一鍵安裝的可用選擇 msi 安裝包,不想安裝的可用選擇 zip 或 Portable 版本,也就是俗稱的綠色版,隻需要手工配置環境變量即可使用,很友善。我選擇的正是 Strawberry Perl Portable 版本:strawberry-perl-5.24.1.1-64bit-portable.zip ,解壓後配置環境變量就可以直接使用。

安裝 nasm 編譯器

NASM全稱The Netwide Assembler,是一款基于 x86 和 x64 平台的彙編語言編譯程式,其設計初衷是為了實作編譯器程式跨平台和子產品化的特性。NASM支援大量的檔案格式,包括 Linux,*BSD,a.out,ELF,COFF,Mach−O,Microsoft 16−bit OBJ,Win32 以及 Win64,同時也支援簡單的二進制檔案生成。它的文法被設計的簡單易懂,相較 Intel 的文法更為簡單,支援目前已知的所有 x86 架構之上的擴充文法,同時也擁有對宏指令的良好支援。

可以在 nasm 官網下載下傳最新 win64 安裝包,我這裡使用的是 nasm-2.15.05-win64.zip ,解壓後設定環境變量即可使用。

nasm 官網 https://www.nasm.us/

nasm 簡介 http://www.bytekits.com/nasm/intro.html

設定 Perl 和 nams 環境變量

Win 10 可以在 系統屬性 —— 進階 —— 環境變量 —— 系統變量 中增加 Path 中的路徑,如下圖

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-8xPRymNO-1665832234264)(./image/perl_nasm_path.png)]

安裝 OpenSSL

  • 解壓 openssl-1.1.1.tar.gz
  • 調出 VS 2015 中的 VS 2015 x64 本機工具指令提示符
  • 在指令提示符中進入 openssl-1.1.1 目錄,執行

    perl Configure VC-WIN64A --prefix="D:\Program Files\openssl"

    ,編譯 64 位 OpenSSL ,并将其安裝到 D:\Program Files\openssl ,因為目錄中有空格符,需要用雙引号括起來。運作過程中會提示已建立 makefile 檔案:
    Configuring OpenSSL version 1.1.1 (0x1010100fL) for VC-WIN64I
    Using os-specific seed configuration
    Creating configdata.pm
    Creating makefile
    
    **********************************************************************
    ***                                                                ***
    ***   If you want to report a building issue, please include the   ***
    ***   output from this command:                                    ***
    ***                                                                ***
    ***     perl configdata.pm --dump                                  ***
    ***                                                                ***
    **********************************************************************
               
    Windows 版本選擇一般有三種架構:VC-WIN32 | VC-WIN64A | VC-WIN64I
    • VC-WIN32 是 32 位版本;
    • VC-WIN64A 是正常的 64 位版本,AMD 和英特爾 i 系列 x64 都用這個選項;
    • VC-WIN64 是 IA-64 版本,與 x86 指令不相容,Intel 安騰系列伺服器 CPU 采用此架構。
  • 運作

    nmake

  • 運作

    nmake install

    ,這一步需要管理者權限,因為需要從系統盤中拷貝檔案。

也可以像 zlib 一樣,為 OpenSSL 寫一個編譯腳本 build_openssl_vs2015_64.bat ,内容如下:

@echo "begin complete openssl"
set VS="C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" amd64
set INSTALL="D:\Program Files\openssl"

@rem 調用 VS 環境
call %VS%

@rem 進入 D 盤
D:

@rem 進入 openssl 目錄中進行編譯
cd "D:\Program Files\openssl-1.1.1"
perl Configure VC-WIN64A --prefix=%INSTALL%
nmake clean
nmake
nmake install

@echo "end complete openssl"
pause
           

即可将 OpenSSL 編譯安裝到目錄 D:\Program Files\openssl 中,注意,因為要從系統盤中拷貝檔案,是以需要管理者的權限運作。注意,第 9 行不能省,因為 CMD 中管理者預設處于系統盤(C: 盤)中,若省略,則無法進入 D: 目錄。若是安裝包都放于 C 盤,則可以省略此行。

安裝 Libevent

先來看看,在 Windows 上不做任何修改,直接解壓編譯 libevent-2.1.12-stable 會出現什麼問題。

  • 解壓 libevent-2.1.12-stable.tar.gz
  • 調出 VS 2015 中的 VS 2015 x64 本機工具指令提示符
  • 在指令提示符中進入 libevent-2.1.12-stable 目錄,執行

    nmake /f Makefile.nmake

    ,此時會報錯 “UINT32_MAX”: 未聲明的辨別符
    event.c
    d:\program files\libevent-2.1.12-stable\minheap-internal.h(73): error C2065: “UINT32_MAX”: 未聲明的辨別符
               
    我在網上搜了一下,很多人都說直接在 mm-internal.h 檔案裡引入頭檔案

    #include <stdint.h>

    ,但我覺得修改源碼不是本意,後來發現可以在 WIN32-Code\nmake\event2\event-config.h 中修改,直接放開

    EVENT__HAVE_STDINT_H

    的宏定義
    /* Define to 1 if you have the <stdint.h> header file. */
    /* #define EVENT__HAVE_STDINT_H 1 */
    #define EVENT__HAVE_STDINT_H 1
               
  • 繼續執行

    nmake /f Makefile.nmake

    ,此時又會報錯 無法解析的外部符号 if_nametoindex
    libevent.lib(evutil.obj) : error LNK2019: 無法解析的外部符号 if_nametoindex,該符号在函數 evutil_inet_pton_scope 中被引用
    regress.exe : fatal error LNK1120: 1 個無法解析的外部指令
               
    這是因為編譯靜态庫,缺少庫檔案

    Iphlpapi.lib

    的引用,這是 Windows 一個網絡名稱和索引的轉換庫,具體可參考 Microsoft 官方說明 。此時隻需要在 test/Makefile.nmake 中加入這個庫即可
    LIBS=..\libevent.lib ws2_32.lib shell32.lib advapi32.lib Iphlpapi.lib
               
    至此問題全部解決,再次編譯則全部通過。這種編譯雖然可以使用,但并不包含 OpenSSL 和 zlib ,是以還需要将這兩部分加入到 Libevent 的編譯中。
  • 在編譯時指定 OpenSSL 的目錄
    nmake /f Makefile.nmake clean	# 先清除掉以前的編譯檔案
    nmake /f Makefile.nmake OPENSSL_DIR="d:\Progra~1\openssl"
               
    因為 Libevent 中引用的 OpenSSL 庫比較老,新版的 OpenSSL 已經更改了生成的庫檔案名,是以還需要修改 test/Makefile.nmake 中引用的庫檔案名稱
    SSL_LIBS=..\libevent_openssl.lib $(OPENSSL_DIR)\lib\libeay32.lib $(OPENSSL_DIR)\lib\ssleay32.lib gdi32.lib User32.lib
    
    # 改為
    
    SSL_LIBS=..\libevent_openssl.lib $(OPENSSL_DIR)\lib\libssl.lib $(OPENSSL_DIR)\lib\libcrypto.lib gdi32.lib User32.lib
               

    另外,需要注意,我的 OpenSSL 位于 D:\Program Files\openssl ,目錄中有個空格,即便用雙引号括起來也沒有用,不過可以用 縮寫法 。

    CMD 中可以采用 8 個字元縮寫,即寫頭六個字母(略去空白),另加波浪号和數字。若首字母不足六個,則略去空白,采用第二個字母。比如一下三個目錄

    • Program Files
    • Progra file
    • Progra xxxx
    的縮寫分别為:C:\Progra~1; C:\Progra~2; C:\Progra~3 。
  • 編譯完成後,到 test 目錄中執行 regress.exe 測試程式:
    D:\Program Files\libevent-2.1.12-stable\test>regress.exe
    main/methods: [forking] [warn] event.c: no event mechanism available
    OK
    main/version: OK
    main/base_features: [forking] OK
    main/base_environ: [forking] SKIPPED
    main/event_base_new: [forking] OK
    main/free_active_base: [forking] OK
    ......
    bufferevent/bufferevent_trigger_defer_postpone: [forking] OK
    bufferevent/bufferevent_zlib: SKIPPED
    bufferevent/bufferevent_connect_fail_eventcb_defer: [forking] OK
    ......
    ssl/bufferevent_socketpair: [forking] OK
    ssl/bufferevent_socketpair_write_after_connect: [forking] OK
    ssl/bufferevent_filter: [forking] OK
    ssl/bufferevent_filter_write_after_connect: [forking] OK
    ssl/bufferevent_renegotiate_socketpair: [forking] OK
    ssl/bufferevent_renegotiate_filter: [forking] OK
    ssl/bufferevent_socketpair_startopen: [forking] OK
    ssl/bufferevent_filter_startopen: [forking] OK
    ssl/bufferevent_socketpair_dirty_shutdown: [forking] OK
    ssl/bufferevent_filter_dirty_shutdown: [forking] OK
    ssl/bufferevent_renegotiate_socketpair_dirty_shutdown: [forking] OK
    ssl/bufferevent_renegotiate_filter_dirty_shutdown: [forking] OK
    ssl/bufferevent_socketpair_startopen_dirty_shutdown: [forking] OK
    ssl/bufferevent_filter_startopen_dirty_shutdown: [forking] OK
    ssl/bufferevent_socketpair_fd: [forking] OK
    ssl/bufferevent_socketpair_freed: [forking] OK
    ssl/bufferevent_socketpair_freed_fd: [forking] OK
    ssl/bufferevent_filter_freed_fd: [forking] OK
    ssl/bufferevent_socketpair_timeout: [forking] OK
    ssl/bufferevent_socketpair_timeout_freed_fd: [forking] OK
    ssl/bufferevent_connect: [forking] OK
    ssl/bufferevent_connect_sleep: [forking] OK
    ssl/bufferevent_wm: [forking] OK
    ssl/bufferevent_wm_filter: [forking] OK
    ssl/bufferevent_wm_defer: [forking] OK
    ssl/bufferevent_wm_filter_defer: [forking] OK
               
    可以看到,OpenSSL 的測試程式全部 OK,但是 zlib 測試程式 bufferevent_zlib 卻被跳過。
  • 要使用 zlib ,需要修改 test/Makefile.nmake 和 WIN32-Code\nmake\event2\event-config.h ,步驟如下
    # 1. 引用 zlib 頭檔案
    CFLAGS=/I.. /I../../zlib/include
    
    # 2. 增加 zlib 的測試檔案,在 REGRESS_OBJS 追加 regress_zlib.obj
    REGRESS_OBJS=... regress_zlib.obj
    
    # 3. 引用 zlib 庫檔案,這裡應用動态庫
    LIBS=..\libevent.lib ...... ../../zlib/lib/zdll.lib
    
    # 4. 在 WIN32-Code\nmake\event2\event-config.h 中添加 zlib 宏定義
    /* Define if the system has zlib */
    /* #undef EVENT__HAVE_LIBZ */
    #define EVENT__HAVE_LIBZ
    
    # 5. 重新編譯
    nmake /f Makefile.nmake clean
    nmake /f Makefile.nmake OPENSSL_DIR="d:\Progra~1\openssl"
    
    # 6. 運作 test 中的 regress.exe 程式,可以成功調用 zlib
    ......
    bufferevent/bufferevent_zlib: [forking] OK
    ......
               

如果在測試中出現 找不到 libssl-1_1-x64.dll 錯誤

Libevent 學習一:Libevent 源碼編譯Libevent 學習一:Libevent 源碼編譯

是因為沒有找到 OpenSSL 的動态庫,隻需要将 libssl-1_1-x64.dll 和 libcrypto-1_1-x64.dll 拷貝到 test 目錄中即可。

同樣的,也可以為 Libevent 寫一個編譯腳本 build_libevent_vs2015_64 .bat ,内容如下

@echo "begin complete libevent"
set VS="C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" amd64
set INSTALL="D:\Program Files\libevent"

@rem 調用 VS 環境
call %VS%

@rem 進入 D 盤
D:

@rem 進入 libevent 目錄中進行編譯
cd "D:\Program Files\libevent-2.1.12-stable"
nmake /f Makefile.nmake clean
nmake /f Makefile.nmake OPENSSL_DIR="d:\Progra~1\openssl"

@rem 拷貝編譯後的檔案
md %INSTALL%\bin
md %INSTALL%\lib
md %INSTALL%\include
copy /Y *.dll %INSTALL%\bin
copy /Y *.exe %INSTALL%\bin
copy /Y *.lib %INSTALL%\lib
xcopy /S/Y include %INSTALL%\include
xcopy /S/Y WIN32-Code\nmake\event2 %INSTALL%\include\event2

@echo "end complete libevent"
pause
           

以上就是通過 nmake 編譯 Libevent 的全部過程,可以看到,還是比較反鎖的,而且還隻能生成靜态庫。好在還可以使用 cmake 來編譯 Libevent ,既可以生成靜态庫,還可以生成動态庫。

cmake 安裝 Libevent

cmake 安裝 Libevent 還是比較簡單的,隻需要指定 OpenSSL 和 zlib 的目錄即可,但比較違和的地方是頭檔案和庫檔案路徑要分開指定,我也不知道為啥。另外,test 中的 regress 測試程式需要依賴 Python2 才能使用(RPC 部分的代碼需要 Python2 生成),我電腦上沒有 python2 的環境,也隻好略過。

  • 解壓 libevent-2.1.12-stable.tar.gz
  • 調出 VS 2015 中的 VS 2015 x64 本機工具指令提示符 (不能直接cmd,會找不到某些環境變量)
  • 在指令提示符中進入 libevent-2.1.12-stable 目錄,執行如下指令
    # 1. 建立 release 目錄,放編譯産生的檔案,避免污染源碼
    mkdir release
    cd release
    
    # 2. 指定 cmake 配置,包含編譯類型(靜态庫),安裝目錄,OpenSSL 和 zlib 的目錄
    cmake.exe .. -G "Visual Studio 14 2015 Win64" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="D:\Progra~1\libevent_s" -DOPENSSL_ROOT_DIR="d:\Progra~1\openssl" -DOPENSSL_CRYPTO_LIBRARY="d:\Progra~1\openssl\lib" -DOPENSSL_INCLUDE_DIR="d:\Progra~1\openssl\include" -DZLIB_LIBRARY="d:\Progra~1\zlib\lib\zdll.lib" -DZLIB_INCLUDE_DIR=="d:\Progra~1\zlib\include" -DEVENT__LIBRARY_TYPE=STATIC
    
    # 3. 編譯為 release 版本
    cmake.exe --build . --config Release
    
    # 4. 安裝到指定目錄中 DCMAKE_INSTALL_PREFIX="D:\Progra~1\libevent_s"
    cmake.exe --install .
    
    # 5. 如果編譯動态庫,隻需要修改第 2 步的 cmake 配置即可
    cmake.exe .. -G "Visual Studio 14 2015 Win64" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="D:\Progra~1\libevent" -DOPENSSL_ROOT_DIR="d:\Progra~1\openssl" -DOPENSSL_CRYPTO_LIBRARY="d:\Progra~1\openssl\lib" -DOPENSSL_INCLUDE_DIR="d:\Progra~1\openssl\include" -DZLIB_LIBRARY="d:\Progra~1\zlib\lib\zdll.lib" -DZLIB_INCLUDE_DIR=="d:\Progra~1\zlib\include"
    
    # 6. 再次執行 3. 4 兩部進行動态庫的編譯和安裝
    cmake.exe --build . --config Release
    cmake.exe --install .
               

cmake 安裝的最大好處就是不需要像 nmake 那樣修改源碼,cmake 會自動檢測機器中的程式配置,并設定号編譯資訊,節省了工作,推薦使用 cmake 編譯。

如果提示找不到 OpenSSL,那是因為 OpenSSL 的目錄不在 PATH 環境變量中,直接添加進去,重新 cmake 一次即可。

後來換了win11的系統,不知為啥 d:\Progra~1 變成一個不可識别的路徑,它在 win10 上表示第一個已 Progra 開頭的路徑。後來在 win11 上換成了 D:\ProgramFiles 就沒有問題了,即

是以說,在 windows 上使用 nmake 或 cmake 安裝程式時,最好不要有帶空格的目錄,否則會報一些莫名其妙的問題。

Libevent 測試程式

接下來寫一個簡單的測試程式,測試 Libevent 安裝是否成功,代碼如下:

#include <iostream>
#include "event.h"

int main(int argc, char* argv[])
{
#ifdef _WIN32
    // 初始化 socket 庫
    WSADATA wsa;
    WSAStartup(MAKEWORD(2, 2), &wsa);
#endif

    std::cout << "test libevent!" << std::endl;
    // 建立 libevent 上下文
    event_base *base = event_base_new();
    if (base) {
        std::cout << "event_base_new success!" << std::endl;
    }
    return 0;
}
           

代碼很簡單,就是建立了一個 Libevent 上下文。特别說明一下第 6 ~ 10 行,這幾行的功能是初始化 Windows 下的 socket 庫,或者是初始化 Win32 程式,需要單獨調用,也不知道是什麼原因,感覺怪怪的。

Libevent 并沒有專門針對 socket 去程式設計,而是所有的檔案 IO 都可以被處理,包括普通檔案的 IO ,管道 IO 等。

最後,需要在 VS 2015 的項目屬性中設定頭檔案和庫檔案的路徑,以及庫檔案名稱。前面兩個路徑根據實際安裝目錄進行選擇,庫檔案除了需要 event.lib 外,還需要 ws2_32.lib ,它是 Win32 中的 socket 庫。

若是使用靜态庫,則還會有一個問題,編譯時提示:

event.lib(evutil.obj) : error LNK2001: 無法解析的外部符号 if_nametoindex
1>D:\vs2015\libevent_demo\x64\Release\demo_server_test.exe : fatal error LNK1120: 1 個無法解析的外部指令
           

需要再添加 Iphlpapi.lib ,但編譯時還會提示如下警告:

1>LINK : warning LNK4098: 預設庫“LIBCMT”與其他庫的使用沖突;請使用 /NODEFAULTLIB:library
           

這裡不做深究,但個人推薦,還是使用動态庫比較好,至少沒有這麼多亂七八糟的問題。

Libevent Linux編譯

個人感覺,Libevent 在 Linux 上的編譯比 Windows 上要簡單很多,貌似開源軟體都是這樣。

CentOS 7 安裝 Libevent

Linux 上的編譯環境:

  • CentOS 7 + gcc/g++ 4.8.5
  • zlib-1.2.11
  • openssl-1.1.1 (可以直接使用 configure 進行安裝,不需要 Perl)
  • libevent-2.1.12-stable

這裡将所有的軟體都安裝在 H O M E / . l o c a l / ∗ ∗ 目錄中,是以需要先確定 ∗ ∗ HOME/.local/** 目錄中,是以需要先確定 ** HOME/.local/∗∗目錄中,是以需要先確定∗∗HOME/.local/bin 位于 PATH 環境變量中,否則 Libevent 會找不到 OpenSSL 和 zlib,當然也可以通過編譯選項指定它們的目錄。安裝方法如下:

# 1. 安裝 zlib
$ tar zxvf zlib-1.2.11.tar.gz
$ cd zlib-1.2.11
$ ./configure --prefix=$HOME/.local/
$ make
$ make install

# 2. 安裝 openssl
$ tar zxvf openssl-1.1.1.tar.gz
$ cd openssl-1.1.1
$ ./config --prefix=$HOME/.local/
$ make
$ make install

# 3. 安裝 libevent
$ tar zxvf libevent-2.1.12-stable.tar.gz
$ cd libevent-2.1.12-stable
$ ./configure --prefix=$HOME/.local/
......
# 可以看到,zlib 和 openssl 都被成功檢索到
checking zlib.h usability... yes
checking zlib.h presence... yes
checking for zlib.h... yes
checking for library containing inflateEnd... -lz
checking for special C compiler options needed for large files... no
checking for _FILE_OFFSET_BITS value needed for large files... no
checking for pkg-config... /usr/bin/pkg-config
checking if pkg-config is at least version 0.15.0... yes
checking openssl/ssl.h usability... yes
checking openssl/ssl.h presence... yes
......
$ make
$ make install

# 4. 測試 libevent test 程式
cd test/
./regress
# 需要将 $HOME/.local/lib 添加到 LD_LIBRARY_PATH 中,否則找不到庫檔案
......
bufferevent/bufferevent_zlib: [forking] OK
......
ssl/bufferevent_socketpair: [forking] OK
ssl/bufferevent_socketpair_write_after_connect: [forking] OK
ssl/bufferevent_filter: [forking] OK
ssl/bufferevent_filter_write_after_connect: [forking] OK
ssl/bufferevent_renegotiate_socketpair: [forking] OK
......
           

可以看到,zlib 和 openssl 都被測試通過。

在安裝 libevent 時若提示找不到 openssl,可以使用 CPPFLAGS 和 LDFLAGS 指定安裝目錄,盡量不要使用 CFLAGS,會提示兩條 WARNING(我是安裝在使用者目錄,若是安裝在系統目錄,應該無此問題)。示例如下:

# 使用 CFLAGS 會提示兩條 WARNING,可以使用 CPPFLAGS
./configure CFLAGS=-I$HOME/.local/include LDFLAGS=-L$HOME/.local/lib --prefix=$HOME/.local

checking zlib.h usability... yes
checking zlib.h presence... no
configure: WARNING: zlib.h: accepted by the compiler, rejected by the preprocessor!
configure: WARNING: zlib.h: proceeding with the compiler's result
checking for zlib.h... yes
checking for library containing inflateEnd... -lz
checking for special C compiler options needed for large files... no
checking for _FILE_OFFSET_BITS value needed for large files... no
checking for pkg-config... /usr/bin/pkg-config
checking if pkg-config is at least version 0.15.0... yes
checking for library containing SSL_new... -lssl
checking openssl/ssl.h usability... yes
checking openssl/ssl.h presence... no
configure: WARNING: openssl/ssl.h: accepted by the compiler, rejected by the preprocessor!
configure: WARNING: openssl/ssl.h: proceeding with the compiler's result

# 檢視幫助文檔,CPPFLAGS 包含了 C/C++ 的頭檔案目錄
./configure CPPFLAGS=-I$HOME/.local/include LDFLAGS=-L$HOME/.local/lib --prefix=$HOME/.local
           

Libevent 測試程式

CentOS 7 Libevent 測試程式與 Windows 上一樣,隻是需要編寫 Makefile 進行編譯:

# libevent_demo makefile

CPP = g++
DEBUG = -g
CPPFLAGS = -Wall $(DEBUG) -I$(HOME)/.local/include
LIBS = -L$(HOME)/.local/lib -levent

TARGET := $(subst .cpp,,$(wildcard *.cpp))

all: $(subst .cpp,,$(wildcard *.cpp))

% : %.cpp
        $(CPP) -o [email protected] $^ $(CPPFLAGS) $(LIBS)

.PHONY : clean
clean:
        rm -rf $(TARGET)
           

這是一個比較獨立的 Makefile ,可以将目錄中的每個 cpp 檔案編譯為獨立的可執行程式。

另外說明一點,Linux 預設對庫的連接配接是使用動态庫,在找不到動态庫的情況下才選擇靜态庫,若目前目錄有兩個庫 libevent.so 和 libevent.a ,則肯定是連接配接 libevent.so ,使用方式為:

g++ test.cpp -L. -levent
           

如果要指定連接配接靜态庫 libevent.a ,可使用如下方式:

g++ test.cpp -L. -static -levent