1. 程式人生 > >libevent2筆記(linux、windows、android的編譯)

libevent2筆記(linux、windows、android的編譯)

0. 前言

1. 功能總結

libevent的核心作用是實現訊息迴圈、訊息佇列管理與回撥,可用來監聽檔案(socket也算檔案)屬性變化、超時、鎖狀態變化,其中超時可以用作Timer。
額外的功能是作為HTTP的server或client。

2. 編譯

2.1 Linux版編譯

在目錄下
./configure && make
即可在./.lib/下得到5個.a靜態庫。 不確定是否在此之前我已安裝好各種依賴庫所以沒遇到任何障礙

[email protected] ~/Downloads/libevent-2.0.21-stable/.libs $ ll *.a
-rw-r--r-- 1 liuhx liuhx 2309114 Feb 17 13:38 libevent.a
-rw-r--r-- 1 liuhx liuhx 1431730 Feb 17 13:38 libevent_core.a
-rw-r--r-- 1 liuhx liuhx  877456 Feb 17 13:38 libevent_extra.a
-rw-r--r-- 1 liuhx liuhx  195868 Feb 17 13:38 libevent_openssl.a
-rw-r--r-- 1 liuhx liuhx   21998 Feb 17 13:38 libevent_pthreads.a
檢視Makefile檔案的內容,可得知4個靜態庫對應的原始檔:
CORE_SRC = event.c evthread.c buffer.c \
	bufferevent.c bufferevent_sock.c bufferevent_filter.c \
	bufferevent_pair.c listener.c bufferevent_ratelim.c \
	evmap.c	log.c evutil.c evutil_rand.c strlcpy.c $(SYS_SRC)
EXTRA_SRC = event_tagging.c http.c evdns.c evrpc.c
libevent_pthreads_la_SOURCES = evthread_pthread.c
libevent_openssl_la_SOURCES = bufferevent_openssl.c
即libevent_core.a裡是核心功能,其中$(SYS_SRC)在各個平臺會不同,linux下是select.c、poll.c、epoll.c、signal.c等,windows下是win32select.c evthread_win32.c等,不一一列舉了。libevent_extra.a裡包含http、dns等功能。另外兩個libevent_*.a就見名知意了。而libevent.a是libevent_core.a和libevent_extra.a的集合。

2.2 Windows版編譯

可以用VS的Command Prompt(開始選單->Visual Studio 2013->Visual Studio Tools->VS2013 x64 Native Tools Command Prompt,VS和CPU版本應對應到你所用的)在libevent目錄下
nmake Makefile.nmake
就能得到

2015/02/26  10:40           336,040 libevent_extras.lib
2015/02/26  10:40           789,110 libevent.lib
2015/02/26  10:40           453,366 libevent_core.lib
3個靜態庫檔案。

不過一般會習慣做成VS工程。所以新建一個VS靜態庫工程,對著Makefile.nmake的內容新增原始檔、引用目錄、預編譯命令就行了。vcproj的部分內容如下:

<ClCompile Include="..\..\..\third_party\libevent-2.0.21-stable\buffer.c" />
<ClCompile Include="..\..\..\third_party\libevent-2.0.21-stable\bufferevent.c" />
<ClCompile Include="..\..\..\third_party\libevent-2.0.21-stable\bufferevent_async.c" />
<ClCompile Include="..\..\..\third_party\libevent-2.0.21-stable\bufferevent_filter.c" />
<ClCompile Include="..\..\..\third_party\libevent-2.0.21-stable\bufferevent_pair.c" />
<ClCompile Include="..\..\..\third_party\libevent-2.0.21-stable\bufferevent_ratelim.c" />
<ClCompile Include="..\..\..\third_party\libevent-2.0.21-stable\bufferevent_sock.c" />
<ClCompile Include="..\..\..\third_party\libevent-2.0.21-stable\buffer_iocp.c" />
<ClCompile Include="..\..\..\third_party\libevent-2.0.21-stable\evdns.c" />
<ClCompile Include="..\..\..\third_party\libevent-2.0.21-stable\event.c" />
<ClCompile Include="..\..\..\third_party\libevent-2.0.21-stable\event_iocp.c" />
<ClCompile Include="..\..\..\third_party\libevent-2.0.21-stable\event_tagging.c" />
<ClCompile Include="..\..\..\third_party\libevent-2.0.21-stable\evmap.c" />
<ClCompile Include="..\..\..\third_party\libevent-2.0.21-stable\evrpc.c" />
<ClCompile Include="..\..\..\third_party\libevent-2.0.21-stable\evthread.c" />
<ClCompile Include="..\..\..\third_party\libevent-2.0.21-stable\evthread_win32.c" />
<ClCompile Include="..\..\..\third_party\libevent-2.0.21-stable\evutil.c" />
<ClCompile Include="..\..\..\third_party\libevent-2.0.21-stable\evutil_rand.c" />
<ClCompile Include="..\..\..\third_party\libevent-2.0.21-stable\http.c" />
<ClCompile Include="..\..\..\third_party\libevent-2.0.21-stable\listener.c" />
<ClCompile Include="..\..\..\third_party\libevent-2.0.21-stable\log.c" />
<ClCompile Include="..\..\..\third_party\libevent-2.0.21-stable\signal.c" />
<ClCompile Include="..\..\..\third_party\libevent-2.0.21-stable\strlcpy.c" />
<ClCompile Include="..\..\..\third_party\libevent-2.0.21-stable\win32select.c" />

windows平臺在連結時需要加入ws2_32.lib和wsock32.lib

2.3 Android版編譯

若是能看懂linux和windows的Makefile,那是很容易寫好Android.mk的。但在此之前需要生成好android版的config.h和event-config.h。

目錄下執行(ndk版本隨意,請替換成對應的路徑):

SYSROOT=~/Applications/android-ndk-r8e/platforms/android-8/arch-arm
./configure --host=arm-linux-androideabi CC=~/Applications/android-ndk-r8e/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc CFLAGS=--sysroot=$SYSROOT

這樣就會生成好config.h了。然後再
make
過程中會呼叫sed修改好event-config.h。順利的話會生成四個.a

[email protected] ~/Downloads/libevent-2.0.21-stable/.libs $ ll *.a
-rw-r--r-- 1 liuhx liuhx 455082 Feb 26 14:59 libevent.a
-rw-r--r-- 1 liuhx liuhx 267398 Feb 26 14:59 libevent_core.a
-rw-r--r-- 1 liuhx liuhx 187756 Feb 26 14:59 libevent_extra.a
-rw-r--r-- 1 liuhx liuhx   4014 Feb 26 14:59 libevent_pthreads.a
因為沒有編譯OpenSSL,所以不會有libevent_openssl.a。

前面的過程會弄好config.h和event-config.h,其中event-config.h是對應android版本的配置,是必須的,不然編不過,所以無法一上來就用Android.mk。過了make這一步才行,也就是要保留修改過的event-config.h來使用下面的Android.mk

LOCAL_PATH := $(call my-dir)/..
include $(CLEAR_VARS)
LOCAL_MODULE := libevent

LOCAL_SRC_FILES := \
    event.c \
    evutil.c \
    epoll.c \
    log.c \
    poll.c \
    select.c \
    signal.c \
    http.c \
    buffer.c \
    evthread.c \
    evmap.c \
    bufferevent.c \
    listener.c \
    evutil_rand.c \
    bufferevent_sock.c \
    bufferevent_filter.c \
    bufferevent_pair.c \
    strlcpy.c \
    event_tagging.c \
    evrpc.c \
    bufferevent_ratelim.c \
    evdns.c \
    evthread_pthread.c

LOCAL_C_INCLUDES := \
	$(LOCAL_PATH) \
    $(LOCAL_PATH)/include \
    $(LOCAL_PATH)/compat

LOCAL_CFLAGS := -DHAVE_CONFIG_H

include $(BUILD_SHARED_LIBRARY)
注意最後一行在整合到app時應該把BUILD_SHARED_LIBRARY應該替換成BUILD_STATIC_LIBRARY,這裡僅為了編譯。

相關推薦

libevent2筆記linuxwindowsandroid編譯

0. 前言1. 功能總結libevent的核心作用是實現訊息迴圈、訊息佇列管理與回撥,可用來監聽檔案(socket也算檔案)屬性變化、超時、鎖狀態變化,其中超時可以用作Timer。額外的功能是作為HTTP的server或client。2. 編譯2.1 Linux版編譯在目錄下

2018-07-23筆記Linux集群架構 lvs keepalived

gin 參數 進行 prot 硬件 address 編寫 搭建 自定義腳本 18.11 LVS DR模式搭建 原理:client 發送一個pv請求給VIP;VIP 收到這請求後會跟LVS設置的LB算法選擇一個LB 比較合理的realserver,然後把此請求的package

Android 8.0 升級筆記適配圖片通知欄ContentProviderReceiver

Android 8.0 升級筆記 前言 Google 在2017年就釋出了Android 8.0,並且強制AppStore上得應用都要升級,國內得不曉得。為了防止出現之前升級6.0 得時候許可權問題導致Crash這種情況得發生…這次很小心得去看了Google得升級意見,小夥伴們可以自

最全SPARK環境叢集windowslinux的搭建

Spark叢集環境搭建     -0. 前提:配置好Hadoop和JAVA的開發環境          -1. 上傳Spark和Scala壓縮包(到~/software資料夾中)          -2. 解壓壓縮包     $ tar -zxvf ~/software/sp

作業系統----LinuxWindowsMacOs選擇

首先,不管是WINDOWS作業系統、LINUX系統還是蘋果作業系統,甚至包括作業系統的鼻祖UNIX作業系統,最早都是用C語言編寫的。 實際上UNIX作業系統和C語言都是由貝爾實驗室的湯普森(Ken Thompson)和丹尼斯·裡奇(Dennis M. Ritchie)於1971年先後改造

python學習筆記模塊初識pyc和PyCodeObject是什麽

hello 計算 pat 學python 語言 log pre clas 運行 一、模塊初識(一) 模塊,也叫庫。庫有標準庫第三方庫。 註意事項:文件名不能和導入的模塊名相同 1. sys模塊 import sys print(sys.path) #打印環境變量 prin

python學習筆記集合的使用文件操作字符編碼與轉碼函數

函數式編程 close 取值 指定編碼 mage 指定位置 lac 空白 你在 集合 集合(set):把不同的元素組成一起形成集合,是python基本的數據類型。 集合元素(set elements):組成集合的成員 為什麽需要集合? 集合的作用 1 .列表去重復數據

LinuxWindowsMac下破解pycharm,可適用最新版

破解軟體下載地址 連結: https://pan.baidu.com/s/1EhcBym3h5Mk9laM9NRAhzQ 提取碼: hgeg 把檔案移動到 /usr/local/pycharm/bin 下 開啟 pycharm.vmoptions sudo vim pyc

配置android開發環境安裝Android studioAndroid sdk配置react native的Android環境

配置react native的Android環境的步驟比較多,所以單獨提取出來記錄: 提示:如果是想搭建android開發環境安裝Android studio,本記錄貼也適用的 1. 安裝 Android Studio,配置sdk 2.建立一個android專案並執行測試

微信小程式-day02-微信小程式-框架-配置-pageswindowstabBarsdebugjson檔案

1.pages(頁面路徑列表) "pages":[ "pages/index/index", "pages/do/do", "pages/eat/eat", "pages/logs/logs" ] 2.windows(全域性的預設視窗表現) "window":{

個人單子模式學習筆記執行緒安全雙重檢查Volitale

單子模式我已經栽了兩次了,第一次是單子模式沒有考慮執行緒安全,第二次被問到double check 和Volitale。鬼知道下一次我又栽在單子模式的哪兒,所以我決定,見到什麼問題,就都在這兒記著了。 我們先看這種雙重檢查,不加volatile public stat

Sublime Text 3.0-3059 MAC windowsLinux下的破解方法

Sublime Text 3.0-3059 MAC 、windows、Linux下的破解方法 已在mac下親測。 1、首先將下載的“Sublime Text crack”  改名為"Sublime Text"; 2、開啟終端,輸入下載的“Sublime Text crac

Java第十七天學習筆記~集合框架linkedlist雜湊表

  LinkedList 內部是連結串列資料結構,是不同步的。增刪元素的速度很快 package day17; import java.util.Iterator; import java.util.LinkedList; public class LinkedList

Java第十六天學習筆記基本資料物件集合框架

基本資料物件 基本資料型別物件包裝類          * 為了方便操作基本資料型別值,將其封裝成了物件,在物件中定義了屬性和行為豐富了該資料的操作。          * 用

深度學習框架keras平臺搭建關鍵字:windows非GPU離線安裝

當下,人工智慧越來越受到人們的關注,而這很大程度上都歸功於深度學習的迅猛發展。人工智慧和不同產業之間的成功跨界對傳統產業產生著深刻的影響。 最近,我也開始不斷接觸深度學習,之前也看了很多文章介紹,對深度學習的歷史發展以及相關理論知識也有大致瞭解。 但常言道:紙上得來終覺淺,

從javawindowslinux中分析\r和\n

先給出\r、\n的ASCII值 windows中\r\n表示換行: 新建一個txt檔案,輸入A換行B,然後檢視txt的十六進位制,參照上圖0D 0A即回車換行(\r\n)結果如下: linux中\n表示換行: 同樣在linux新建一個

Django筆記Django郵件傳送Django郵箱驗證碼實現

1.settings.py 配置 注意:要開啟IMAP服務  才能傳送郵件  ,在郵箱設定裡的賬戶設定中 # 郵件配置 EMAIL_USE_SSL = True EMAIL_HOST = 'smtp.qq.com' # 如果是 163 改成 smtp.163.co

作業系統UnixWindowsMac OSLinux的故事

為了將大型計算機縮小體積,很多公司都在嘗試。1975年,IBM推出了早起的PC相容機。我們知道,作業系統與CPU是有直接關係,不同的cpu執行的作業系統是不一樣的。當時Unix價格昂貴,IBM一臺PC相容機造價2w美元,作業系統都要花4w。這樣還是無法民用,因此IBM選擇了一家小公司Inter生產的X86系列

Go語言MacLinuxWindows 下交叉編譯

在很多時候,由於開發的方便,會有這樣的場景出現,使用Mac開發或使用Windows開發,需要編譯成Linux系統的執行檔案,那麼如何做到?Go語言提供了非常方便的命令列操作,即可實現。 1、Mac下編譯Linux, Windows # Linux CGO_ENAB

藍的成長記——追逐DBA4:追憶少年情愁,再探oracle安裝Linux下10g11g

***************************************宣告***************************************         個人在oracle路上的成長記錄,其中以藍自喻,分享成長中的情感、眼界與技術的變化與成長。敏