libevent实践01:准备源码、搭建项目、编译脚本和入门例子

news2024/11/18 23:50:51

编译源码

libevent是一个Reactor事件库。

我的理解,就是封装了select、epoll、poll的函数库。有使用select,poll,epoll的需求就可以使用的。

官网地址:https://libevent.org/

下载源码:

https://github.com/libevent/libevent/releases/download/release-2.1.12-stable/libevent-2.1.12-stable.tar.gz

下载后解压源码:

tar zxvf libevent-2.1.12-stable.tar.gz

 在源码目录下创建_install目录,然后执行 ./configure --prefix=/big/libevent/libevent-2.1.12-stable/_install。

/big/libevent/libevent-2.1.12-stable/_install这个就是编译后安装的目录。详细步骤如下所示:

lkmao@ubuntu:/big/libevent$ ls
libevent-2.1.12-stable  libevent-2.1.12-stable.tar.gz
lkmao@ubuntu:/big/libevent$ cd libevent-2.1.12-stable/
lkmao@ubuntu:/big/libevent/libevent-2.1.12-stable$ mkdir _install
lkmao@ubuntu:/big/libevent/libevent-2.1.12-stable$ cd _install/
lkmao@ubuntu:/big/libevent/libevent-2.1.12-stable/_install$ pwd
/big/libevent/libevent-2.1.12-stable/_install
lkmao@ubuntu:/big/libevent/libevent-2.1.12-stable/_install$ cd ..
lkmao@ubuntu:/big/libevent/libevent-2.1.12-stable$ ./configure --prefix=/big/libevent/libevent-2.1.12-stable/_install

        这一步是用来生成编译时用的makefile文件,其中,--prefix用来指定Libevent的安装目录。输入make进行编译,成功后再输入make install,然后就可以看到/big/libevent/libevent-2.1.12-stable/_install下面已经有文件生成了:

lkmao@ubuntu:/big/libevent/libevent-2.1.12-stable$ make
/*略*/
lkmao@ubuntu:/big/libevent/libevent-2.1.12-stable$ make install
/*略*/
lkmao@ubuntu:/big/libevent/libevent-2.1.12-stable$ cd _install/
lkmao@ubuntu:/big/libevent/libevent-2.1.12-stable/_install$ ls
bin  include  lib

        其中include是存放头文件的目录,lib是存放动态库和静态库的目录。接下来用一个小程序来测试是否工作正常。

二 创建项目并测试 

 创建一个目录,用于存放我们的工程文件和源码:

lkmao@ubuntu:/big/libevent/libevent-2.1.12-stable/_install$ mkdir learn
lkmao@ubuntu:/big/libevent/libevent-2.1.12-stable/_install$ cd learn/

在目录下创建三个文件,

  1. 编译脚本build.sh
  2. cmake文件CMakeLists.txt
  3. 源码文件main_01.c 
lkmao@ubuntu:/big/libevent/libevent-2.1.12-stable/_install/learn$ ls
build.sh  CMakeLists.txt  main_01.c
lkmao@ubuntu:/big/libevent/libevent-2.1.12-stable/_install/learn$

 下面分别介绍三个文件内容

main_01.c

创建源文件:main_01.c,输入如下代码,如果写过select函数,很快就能了解,此代码的功能是设置一个定时器,然后每隔1秒就打印一次“timer wakeup!counter = %d”。

 printf("timer wakeup!counter = %d\n",counter++);

#include <sys/types.h>
#include <event2/event-config.h>
#include <stdio.h>
#include <event.h>
struct event ev;
struct timeval tv;

void time_cb(int fd, short event, void *argc)
{
static int counter = 0;
    printf("timer wakeup!counter = %d\n",counter++);
    event_add(&ev, &tv);
}

int main()
{
    struct event_base *base = event_init();
    tv.tv_sec = 1;
    tv.tv_usec = 0;
    evtimer_set(&ev, time_cb, NULL);
    event_base_set(base, &ev);
    event_add(&ev, &tv);
    event_base_dispatch(base);
}

build.sh

#!/bin/bash
set -e
rm -rf _build_
mkdir _build_ -p
cmake -S ./ -B _build_
make -C _build_
./_build_/main_01

要保证build.sh文件是可执行的

chmod 777 build.sh 

CMakeLists.txt

project(libevent_project)
cmake_minimum_required(VERSION 3.8)

message(STATUS "lkmao:CMAKE_SOURCE_DIR -- ${CMAKE_SOURCE_DIR}")

set(LIBEVET_INSTALL_PATH "/big/libevent/libevent-2.1.12-stable/_install/")
include_directories(
    ${LIBEVET_INSTALL_PATH}/include 
)

# set(CMAKE_C_COMPILER /arm-gcc/bin/arm-linux-gnueabihf-gcc)
# set(CMAKE_CXX_COMPILER /arm-gcc/bin/arm-linux-gnueabihf-g++)

# SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -pthread")
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread -lstdc++")


message(STATUS "lkmao:PROJECT_SOURCE_DIR -- ${PROJECT_SOURCE_DIR}")

add_executable(main_01 main_01.c)
target_link_libraries(main_01 ${LIBEVET_INSTALL_PATH}/lib/libevent.so)

测试验证

文件都准备好,并输入内容后执行build.sh文件,执行结果如下所示:

lkmao@ubuntu:/big/libevent/libevent-2.1.12-stable/_install/learn$ ./build.sh 
-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- lkmao:CMAKE_SOURCE_DIR -- /big/libevent/libevent-2.1.12-stable/_install/learn
-- lkmao:PROJECT_SOURCE_DIR -- /big/libevent/libevent-2.1.12-stable/_install/learn
-- Configuring done
-- Generating done
-- Build files have been written to: /big/libevent/libevent-2.1.12-stable/_install/learn/_build_
make: Entering directory '/big/libevent/libevent-2.1.12-stable/_install/learn/_build_'
make[1]: Entering directory '/big/libevent/libevent-2.1.12-stable/_install/learn/_build_'
make[2]: Entering directory '/big/libevent/libevent-2.1.12-stable/_install/learn/_build_'
Scanning dependencies of target main_01
make[2]: Leaving directory '/big/libevent/libevent-2.1.12-stable/_install/learn/_build_'
make[2]: Entering directory '/big/libevent/libevent-2.1.12-stable/_install/learn/_build_'
[ 50%] Building C object CMakeFiles/main_01.dir/main_01.c.o
[100%] Linking C executable main_01
make[2]: Leaving directory '/big/libevent/libevent-2.1.12-stable/_install/learn/_build_'
[100%] Built target main_01
make[1]: Leaving directory '/big/libevent/libevent-2.1.12-stable/_install/learn/_build_'
make: Leaving directory '/big/libevent/libevent-2.1.12-stable/_install/learn/_build_'
timer wakeup!counter = 0
timer wakeup!counter = 1
timer wakeup!counter = 2
timer wakeup!counter = 3
timer wakeup!counter = 4
timer wakeup!counter = 5
timer wakeup!counter = 6

由下面的截图可知,我们的测试代码开始运行了。

四 命令行编译 

gcc main_01.c -o testEvent -I /big/libevent/libevent-2.1.12-stable/_install/include/ -L /big/libevent/libevent-2.1.12-stable/_install/lib/ -levent

使用命令行,需要设置环境变量,要不然,找不到库。 

 小结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/699859.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023亚马逊云科技中国峰会主题演讲,分享基础架构在AI浪潮的求新求变

2023亚马逊云科技中国峰会第二天精彩继续&#xff01;6月28日&#xff0c;亚马逊云科技大中华区产品总经理陈晓建在《专注创新&#xff0c;摆脱基础架构束缚》主题演讲中提出&#xff0c;云服务是支持数字创新的关键生产力。在当前生成式AI技术爆发的大环境下&#xff0c;亚马逊…

一种快速估算PCB走线电阻的方法:方块统计

我们通常需要快速地估计出印刷电路板上一根走线或一个平面的电阻值&#xff0c;而不是进行冗繁的计算。 虽然现在已有可用的印刷电路板布局与信号完整性计算程序&#xff0c;可以精确地计算出走线的电阻&#xff0c;但在设计过程中&#xff0c;我们有时候还是希望采取快速粗略…

通过BeautifulSoup获取【领域赛道--大数据与算法】top100用户

文章目录 前言介绍实现帖子地址请求地址引入模块提取代码程序入口提取到的数据 总结最后 前言 博主空空star主页空空star的主页 大家好&#xff0c;我是空空star&#xff0c;本篇给大家分享一下《通过BeautifulSoup获取【领域赛道--大数据与算法】top100用户》。 介绍 Beautif…

社区团购爆品怎么做?社区团购小程序有什么功能?

社区团购爆款可以通过拉新&#xff0c;打好用户基础。刚上线就推行低价爆款拉新&#xff0c;利用一些低成本的奶制品类和禽蛋类&#xff0c;蔬菜类来引流拉新。这一招非常有效&#xff0c;吸引源源不断的客流量汇集平台&#xff0c;庞大的用户流量是订单爆棚的保障。商家/运营方…

这所顶级双非,学硕爆冷上线即录取,保护一志愿!

一、学校及专业介绍 华侨大学是福建省“双一流”建设A类高校&#xff0c;在泉州、厦门分别设有校区&#xff0c;现有28个学院&#xff1b;11个学科门类&#xff0c;9个一级学科博士点&#xff0c;25个一级学科硕士点&#xff0c;23个专业学位硕士点&#xff0c;5个博士后流动站…

性能测试中如何使用RunnerGo还原混合并发场景

我们在进行软件开发时经常需要进行性能测试、压力测试和负载测试。其中有一类测试场景叫做混合并发测试&#xff0c;需要模拟多个接口下不同数量的用户使用场景&#xff0c;检查同时处理多个并发任务的能力&#xff0c;本文将展示如何使用开源的RunnerGo还原混合并发场景。 在…

C语言排序算法实现

1.概述 所谓排序&#xff0c; 就是使一串记录&#xff0c; 按照其中的某个或某些关键字的大小&#xff0c; 递增或递减的排列起来的操作。 排序算法&#xff0c; 就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视&#xff0c; 尤其是在大量数据的处理方面…

数据分析回头看1——Pandas中数据处理总结

0、前言&#xff1a;因为之前自己在学习pandas的过程中就简单做了下笔记&#xff0c;发现在用的时候还是会比较乏力&#xff0c;很多东西容易忘&#xff0c;所以我就决定结合之前笔记的内容&#xff0c;按照使用pandas的习惯&#xff0c;把知识点梳理一下&#xff0c;方便之后查…

网段扫描攻击

攻击简介 如果网络中有用户向设备发送大量目标IP地址不能解析的IP报文&#xff08;即路由表中存在该IP报文的目的IP对应的路由表项&#xff0c;但设备上没有该路由表项中下一跳对应的ARP表项&#xff09;&#xff0c;将导致设备触发大量的ARP Miss消息。 大量的网段扫描报文会…

软件测试的自我学习和提升

软件测试是一项非常重要的工作&#xff0c;它可以确保软件在发布前能够正常运行&#xff0c;在软件开发过程中扮演着至关重要的角色。在这个不断变化和创新的时代&#xff0c;软件测试人员需要不断地学习和提升自己的技能和能力&#xff0c;以适应不同软件发展的需求。 1. 学习…

LeetCode刷题 | 309. 最佳买卖股票时机含冷冻期、714. 买卖股票的最佳时机含手续费

309. 最佳买卖股票时机含冷冻期 给定一个整数数组prices&#xff0c;其中第 prices[i] 表示第 i 天的股票价格 。​ 设计一个算法计算出最大利润。在满足以下约束条件下&#xff0c;你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff09;: 卖出股票后&…

【MySQL学习笔记】(四)MySQL数据类型

MySQL数据类型 1 数据类型分类2 数值类型2.1 tinyint 类型2.2 bit 类型2.3 小数类型2.4 字符串类型2.5 varchar2.6 char和varchar比较 2.6 日期和时间类型2.6 enum 和 set2.6.1 集合查询使用find_ in_ set函数 1 数据类型分类 2 数值类型 2.1 tinyint 类型 数值测试 mysql>…

基于IP 的 Nginx 虚拟主机

目录 一、配置文件&#xff08;不要忘了备份&#xff09; 二、 访问地址 一、配置文件&#xff08;不要忘了备份&#xff09; 二、 访问地址

while(1) 和 for ( ; ; )的区别

while(1) 和 for(;;) 它们不都是无限循环吗&#xff0c;作用应该一样啊&#xff0c;它们到底有什么区别&#xff1f; 要回答这个问题&#xff0c;其实你各自编写一段while(1) 和 for(;;)的代码&#xff0c;编译对比一下代码大小和汇编文件&#xff0c;你就大概知道了。 while(…

Vue.extend

Vue.extend 方法用来对基本的Vue组件进行扩展&#xff0c;&#xff0c;创建他的子类&#xff0c;&#xff0c;通过扩展根节点Vue定义新的组件 const BaseComponent Vue.extend({data(){return{message:"hehe"}}})const ExtendedComponent BaseComponent.extend({mo…

5、Redis持久化

RDB&#xff08;默认&#xff09; 在指定的时间间隔&#xff0c;执行数据集的时间点快照 在指定的时间间隔&#xff0c;执行数据集的时间点快照 实现类似照片记录效果的方式&#xff0c;就是把某一时刻的数据和状态以文件的形式写到磁盘上&#xff0c;也就是快照。这样一来即使…

Mars3d实现对图层树顺序进行了调整的同时调整图层的层级

问题&#xff1a; 1.这个图层管理中的移动图层只是移动在树里的显示关系&#xff0c;数据的叠加优先级没有同步修改 原因&#xff1a; 1. 只对同类型图层才有效&#xff0c;如果是矢量图层需要zIndex的才有效。 比如&#xff1a;都是 geoserver发布的wms图层&#xff0c;这种…

六月喜报 | 震坤行荣获多项行业大奖!

六月喜报 | 震坤行荣获多项行业大奖&#xff01; 六月&#xff0c;震坤行先后荣获上海市工商联工业品服务商会行业五大奖项&#xff0c;以及SiMPL2023第十三届供应链年度中国供应链数字化创新先锋。一路荣誉加冕&#xff0c;蓄势前行&#xff0c;揽获多个行业奖项。 6月1日&am…

局域网远程连接

一根网线连接两台电脑 前言步骤1 设置B“允许远程连接”2 A和B必须在同一个网段下面3 “winr”&#xff0c;输入“mstsc”中4 弹出“远程桌面连接”窗口&#xff0c;输入B的ip地址和B电脑的用户名及密码&#xff08;winL键锁屏&#xff0c;看看B的用户名和密码是什么&#xff0…

python学习——函数

一、函数的定义 函数就是执行特定任务和完成特定功能的一段代码。使用函数可以对代码进行复用&#xff0c;提高代码的可维护性和可读性&#xff0c;使得程序便于调试。 二、函数的创建 创建格式 #创建和格式 def 函数名&#xff08;[参数]&#xff09;:函数体[return xxx]举例…