文章目錄
- 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 需要準備如下工具:
- Visual Studio ,最好是 2015 以上的版本,可以支援 C++11 ,免費的社群版就很好用;
- Perl 和 nasm ,編譯 OpenSSL 的工具,Perl 用于生成 Makefile 檔案,nasm 用于編譯 OpenSSL 中的彙編代碼;
- zlib ,Libevent 本身不需要 zlib 庫,但是測試程式需要,Libevent 可以很友善地使用 zlib 庫處理壓縮和解壓縮資料;
- 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 目錄,執行
,編譯 64 位 OpenSSL ,并将其安裝到 D:\Program Files\openssl ,因為目錄中有空格符,需要用雙引号括起來。運作過程中會提示已建立 makefile 檔案:perl Configure VC-WIN64A --prefix="D:\Program Files\openssl"
Windows 版本選擇一般有三種架構:VC-WIN32 | VC-WIN64A | VC-WIN64IConfiguring 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 *** *** *** **********************************************************************
- 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 目錄,執行
,此時會報錯 “UINT32_MAX”: 未聲明的辨別符nmake /f Makefile.nmake
我在網上搜了一下,很多人都說直接在 mm-internal.h 檔案裡引入頭檔案event.c d:\program files\libevent-2.1.12-stable\minheap-internal.h(73): error C2065: “UINT32_MAX”: 未聲明的辨別符
,但我覺得修改源碼不是本意,後來發現可以在 WIN32-Code\nmake\event2\event-config.h 中修改,直接放開#include <stdint.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
- 繼續執行
,此時又會報錯 無法解析的外部符号 if_nametoindexnmake /f Makefile.nmake
這是因為編譯靜态庫,缺少庫檔案libevent.lib(evutil.obj) : error LNK2019: 無法解析的外部符号 if_nametoindex,該符号在函數 evutil_inet_pton_scope 中被引用 regress.exe : fatal error LNK1120: 1 個無法解析的外部指令
的引用,這是 Windows 一個網絡名稱和索引的轉換庫,具體可參考 Microsoft 官方說明 。此時隻需要在 test/Makefile.nmake 中加入這個庫即可Iphlpapi.lib
至此問題全部解決,再次編譯則全部通過。這種編譯雖然可以使用,但并不包含 OpenSSL 和 zlib ,是以還需要将這兩部分加入到 Libevent 的編譯中。LIBS=..\libevent.lib ws2_32.lib shell32.lib advapi32.lib Iphlpapi.lib
- 在編譯時指定 OpenSSL 的目錄
因為 Libevent 中引用的 OpenSSL 庫比較老,新版的 OpenSSL 已經更改了生成的庫檔案名,是以還需要修改 test/Makefile.nmake 中引用的庫檔案名稱nmake /f Makefile.nmake clean # 先清除掉以前的編譯檔案 nmake /f Makefile.nmake OPENSSL_DIR="d:\Progra~1\openssl"
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
- 編譯完成後,到 test 目錄中執行 regress.exe 測試程式:
可以看到,OpenSSL 的測試程式全部 OK,但是 zlib 測試程式 bufferevent_zlib 卻被跳過。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
- 要使用 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 錯誤
是因為沒有找到 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