libevent实践09:交叉编译并运行定时器测试

news2024/11/15 22:42:21

交叉编译

执行命令:

 ./configure --prefix=/big/libevent/libevent-2.1.12-stable/_arm_install --host=arm-linux-gnueabihf CC=/arm-gcc/bin/arm-linux-gnueabihf-gcc CXX=/arm-gcc/bin/arm-linux-gnueabihf-g++ --disable-openssl

 ./configure --prefix=/big/libevent/libevent-2.1.12-stable/_arm_install --host=arm-linux-gnueabihf CC=/arm-gcc/bin/arm-linux-gnueabihf-gcc CXX=/arm-gcc/bin/arm-linux-gnueabihf-g++ --disable-openssl

命令解析

--prefix:安装目录

--host:搞不清楚

CC:如果环境变量里配置了,可以不带路径

CXX:同CXX

--disable-openssl:如果提示openssl错误,就加上。

然后就是make和make install 

make
make install

编译和安装完毕 

CMakeLists.txt

修改思路

在该CMakeLists.txt中简单实现了arm和ubuntu的兼容。MY_ARCH 如果设置为arm。使用交叉编译,设置为其他字符串,就使用系统默认的gcc和g++。

        库路径这里也是,我的x86版本的库路径是:

        /big/libevent/libevent-2.1.12-stable/_install,

        arm版本的库路径是:

        /big/libevent/libevent-2.1.12-stable/_arm_install。

所以按照这个思路,如果是非arm版本需要设置MY_ARCH为ubuntu。即

        set(MY_ARCH "ubuntu")

project(libevent_project)
cmake_minimum_required(VERSION 3.8)
message(STATUS "lkmao:CMAKE_SOURCE_DIR -- ${CMAKE_SOURCE_DIR}")

set(MY_ARCH "arm")
if(${MY_ARCH} STREQUAL "arm")
    set(CMAKE_C_COMPILER /arm-gcc/bin/arm-linux-gnueabihf-gcc)
    set(CMAKE_CXX_COMPILER /arm-gcc/bin/arm-linux-gnueabihf-g++)
    set(LIBEVET_INSTALL_PATH "/big/libevent/libevent-2.1.12-stable/_${MY_ARCH}_install")
elseif(MY_ARCH)
    set(LIBEVET_INSTALL_PATH "/big/libevent/libevent-2.1.12-stable/_install")
    # message(STATUS "error:MY_ARCH -- ${MY_ARCH}")
endif()
message(STATUS "LIBEVET_INSTALL_PATH -- ${LIBEVET_INSTALL_PATH}")
include_directories(
    ${LIBEVET_INSTALL_PATH}/include 
)

# SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -pthread")
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread -g -Wall")
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)

# add_executable(app main_02.c)
# add_executable(app main_03.c)
# add_executable(app main_04.c)
# add_executable(app main_05.c)
# add_executable(app main_06.c)
# add_executable(app main_07.c)
# add_executable(app main_08.c)
add_executable(app main_09.c)
target_link_libraries(app ${LIBEVET_INSTALL_PATH}/lib/libevent.so)

# add_executable(valgrind1 valgrind1.c)
# add_executable(attribute1 attribute1.c)
# add_executable(attribute2 attribute2.c)

编译脚本:

#!/bin/bash
set -e
rm -rf _build_
mkdir _build_ -p
cmake -S ./ -B _build_
make -C _build_
# ./_build_/main_01
# ./_build_/app
file ./_build_/app
scp ./_build_/app root@192.168.0.30:/home/root
scp /big/libevent/libevent-2.1.12-stable/_arm_install/lib/*so* root@192.168.0.30:/lib
 
# ./_build_/app p1 p2
# ./_build_/app
# ./_build_/valgrind1
# valgrind ./_build_/valgrind1
# ./_build_/attribute1
# ./_build_/attribute2


# 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

测试源码main_09.c:

#include <sys/types.h>
#include <event2/event-config.h>
#include <event2/listener.h>
#include <stdio.h>
#include <event.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#include <signal.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define _DEBUG_INFO
#ifdef _DEBUG_INFO
#define DEBUG_INFO(format, ...) printf("%s:%d $$ "format"\n",__func__,__LINE__ , ##__VA_ARGS__)
#else
#define DEBUG_INFO(format, ...)
#endif

struct private_timer_data{
    struct event ev;
    struct timeval tv;
};

void timer_1s_cb(int fd,short event,void *arg){
    struct private_timer_data * ptd = (struct private_timer_data*)arg;
    DEBUG_INFO("fd = %d, event = %d",fd,(int)event);
    DEBUG_INFO("event = %d,0x%02x %s %s %s %s",event,event,
        ((event & EV_TIMEOUT)?"EV_TIMEOUT":""),
        ((event & EV_READ)?"EV_READ":""),
        ((event & EV_WRITE)?"EV_WRITE":""),
        ((event & EV_PERSIST)?"EV_PERSIST":"")
        );
    static int count = 0;
    count++;
    if(count >= 2){
        event_del(&ptd->ev);
        free(ptd);
    }
}
void timer_5s_cb(int fd,short event,void *arg){
    struct private_timer_data * ptd = (struct private_timer_data*)arg;
    DEBUG_INFO("fd = %d, event = %d",fd,(int)event);
    DEBUG_INFO("event = %d,0x%02x %s %s %s %s",event,event,
        ((event & EV_TIMEOUT)?"EV_TIMEOUT":""),
        ((event & EV_READ)?"EV_READ":""),
        ((event & EV_WRITE)?"EV_WRITE":""),
        ((event & EV_PERSIST)?"EV_PERSIST":"")
        );
    static int count = 0;
    count++;
    if(count >= 2){
        event_del(&ptd->ev);
        free(ptd);
    }
}
void* base_01_thread(void *arg){
    struct event_base *base = (struct event_base *)arg;
    while(event_base_get_num_events(base,EVENT_BASE_COUNT_ADDED) == 0){
        sleep(1);
    }
    
    DEBUG_INFO("%d %d %d",
    event_base_get_num_events(base,EVENT_BASE_COUNT_ADDED),
    event_base_get_num_events(base,EVENT_BASE_COUNT_VIRTUAL),
    event_base_get_num_events(base,EVENT_BASE_COUNT_ACTIVE));
    event_base_dispatch(base);
    event_base_free(base);
    DEBUG_INFO("集合下班了");
    return NULL;
}
int main(int argc, char *argv[]){
    struct event_base *base;
    DEBUG_INFO("libevent version = %s",event_get_version());
    base = event_base_new();
    if(base == NULL){
        DEBUG_INFO("event_base_new error");
    }
    ;
    pthread_t __attribute__((unused)) t1;
    pthread_t __attribute__((unused)) t2;

    if(pthread_create(&t1,NULL,base_01_thread,base) < 0){
        perror((const char*)"pthread_create");
        exit(-1);
    }
    struct private_timer_data * ptd;
    //设置1秒定时器
    ptd = (struct private_timer_data*)malloc(sizeof(struct private_timer_data));
    ptd->tv.tv_sec = 1;
    ptd->tv.tv_usec = 0;
    // evtimer_set(&ptd->ev,timer_1s_cb,ptd);
    event_set((&ptd->ev), -1, EV_PERSIST, (timer_1s_cb), (ptd));
    event_base_set(base,&ptd->ev);
    event_add(&ptd->ev,&ptd->tv);

    //设置5秒定时器
    ptd = (struct private_timer_data*)malloc(sizeof(struct private_timer_data));
    ptd->tv.tv_sec = 5;
    ptd->tv.tv_usec = 0;
    // evtimer_set(&ptd->ev,timer_5s_cb,ptd);
    event_set((&ptd->ev), -1, EV_PERSIST, (timer_5s_cb), (ptd));
    event_base_set(base,&ptd->ev);
    event_add(&ptd->ev,&ptd->tv);
    

    DEBUG_INFO("%d %d %d",
    event_base_get_num_events(base,EVENT_BASE_COUNT_ADDED),
    event_base_get_num_events(base,EVENT_BASE_COUNT_VIRTUAL),
    event_base_get_num_events(base,EVENT_BASE_COUNT_ACTIVE));
    while(event_base_get_num_events(base,EVENT_BASE_COUNT_ADDED) > 0){
        sleep(1);
    }
    sleep(1);
    DEBUG_INFO("byebye");
    return 0;
}

运行编译脚本,并到ARM机器上运行。

 小结

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

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

相关文章

GO 多线程工具使用和分析

GO 多线程工具使用和分析 Go 语言中的 sync 包提供了一些用于同步和互斥访问共享资源的原语&#xff0c;使用这些可以避免多个goroutine同时访问共享资源时出现的问题&#xff0c;他们有&#xff1a; 互斥锁读写锁condWaitGroupmaponcepoolatomic 本文介绍它们的使用方式 互…

【海量数据挖掘/数据分析】 之 关联规则挖掘 Apriori 算法 (数据集、事务、频繁项集、关联规则、支持度、置信度)

【海量数据挖掘/数据分析】 之 关联规则挖掘 Apriori 算法 &#xff08;数据集、事务、频繁项集、关联规则、支持度、置信度&#xff09; 目录 【海量数据挖掘/数据分析】 之 关联规则挖掘 Apriori 算法 &#xff08;数据集、事务、频繁项集、关联规则、支持度、置信度&#x…

4、PCB设计快捷键与关键步骤

4、PCB设计快捷键与关键步骤 一、简介 1.1 常用快捷键&#xff1a; shiftc清除测量的结果&#xff0c;退出高亮。F2进入Board Insight查看板子的细节&#xff0c;相当于放大镜。q切换英制和米制。g切换移动的最小单位。L设置各层的颜色和显示选中元件&#xff0c;再按L是将元…

C#使用XML和Treeview结合实现复杂数据采集功能

一个项目的数据表暂时没有定下来&#xff0c;但是有了一些确定性&#xff1a;   1、比较复杂&#xff0c;可能变化&#xff1b;   2、大部分是选择项目&#xff0c;因为输入项目都差不多&#xff1b;   3、应用程序是C/S的窗体应用。   对于这样的用户需求&#xff0c;…

C++ 基础知识 面试题(一)

1.变量的声明与定义 声明&#xff1a;int x; //告诉编译器这个变量的类型和名称 定义&#xff1a;int x 0; //告诉编译器这个变量的类型和名称&#xff0c;为该变量分配内存空间&#xff0c;并初始化该变量 主要区别在于是否为变量分配内存空间 2.extern关键字 用法一&…

Apache IoTDB 论文入选数据库领域顶级学术会议 ACM SIGMOD

6 月 18-23 日&#xff0c;ACM SIGMOD 会议在美国西雅图举办。Apache IoTDB 的研究成果论文《Apache IoTDB: A Time Series Database for IoT Applications》在大会做了报告&#xff0c;并进行了 Poster 展示。 01 关于 SIGMOD SIGMOD 数据管理国际会议&#xff08;Special Int…

嵌入式系统BSP开发(二)

快递拿到R16的开发板后&#xff0c;通过官方拿到SOCHIP的相关资料&#xff0c;压缩包的名称是lichee.tar.gz 一&#xff0c;解压相关的资料 tar xzvf r16_lichee.tar.gz 解压后得到的资料如下&#xff1a; yveyve:/data/home/yve/Linux/lichee$ ls brandy buildroot build…

计算物理专题:傅里叶变换与快速傅里叶变换

计算物理专题&#xff1a;傅里叶变换与快速傅里叶变换 傅里叶变换提供一个全新的角度去观察和描述问题&#xff0c;如在量子力学中&#xff0c;动量与坐标表象之间的变换就是傅里叶变换。傅里叶变换同意可以用在数据处理等领域。1965年&#xff0c;Cooley 和 Tukey 提出了快速傅…

redis之主从复制、哨兵、集群

文章目录 一、redis的高可用1.1 redis高可用的概念1.2 Redis的高可用技术 二、redis 主从复制2.1主从复制的原理2.2搭建Redis 主从复制 三、Redis 哨兵模式3.1搭建Redis 哨兵模式3.2启动哨兵模式3.3查看哨兵信息3.4故障模拟 四、Redis 群集模式4.1搭建Redis 群集模式 一、redis…

数据结构--串的定义和基本操作

数据结构–串的定义和基本操作 注:数据结构三要素――逻辑结构、数据的运算、存储结构&#xff08;物理结构) 存储结构不同&#xff0c;运算的实现方式不同 \color{pink}存储结构不同&#xff0c;运算的实现方式不同 存储结构不同&#xff0c;运算的实现方式不同 串的定义 串 …

用Java制作简单的记事本

目录 前言 主界面设计 功能实现 打开 另存为 保存 查找 替换 成员变量 其他方法 警告弹窗 不移动光标更新文本框内容 源代码 总结 转载请注明出处&#xff0c;尊重作者劳动成果。 前言 考完试想写敲一下代码就写了一下这个程序&#xff0c;整个也是写了怎么久…

JavaEE语法第二章之多线程(初级一)

一、认识线程 1.1线程的概念 一个线程就是一个 "执行流"。每个线程之间都可以按照顺序执行自己的代码. 多个线程之间 "同时"执行着多份代码。 一家公司要去银行办理业务&#xff0c;既要进行财务转账&#xff0c;又要进行福利发放&#xff0c;还得进行缴…

Docker常见问题集合

一、Docker安装 1、yum 安装 1&#xff09;更新yum包到最新 yum update2&#xff09;安装软件需要的软件&#xff0c;yum-util&#xff08;提供 yum-config-manager 功能&#xff09;&#xff0c;device-mapper-persistent-data、lvm2&#xff08;devicemapper 驱动依赖&…

mmdetection踩坑记录

1.mmcv-full和mmdetection的版本匹配问题 Readme里应该会给可复现的版本&#xff0c;一定要按照readme里的&#xff0c;这里是一些版本对应关系&#xff0c;像我的mmdet是2.3.0&#xff0c;我就只能装1.0.5的mmcv-full 表格来源&#xff1a;https://blog.csdn.net/qq_55957975/…

高频-测试岗面试题,软件测试面试常问面试题(付答案)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 测试流程&#xf…

【Zynq】Xilinx SDK设置编码方式

举例&#xff1a;将Xilinx SDK设置为UTF-8编码 工具栏->Window->Preferences

基于Tensorflow和Keras实现卷积神经网络CNN并进行猫狗识别

文章目录 一、环境配置1、安装Anaconda2、配置TensorFlow、Keras 二、猫狗数据集分类建模3.1 猫狗图像预处理3.2 猫狗分类的实例——基准模型3.1 构建神经网络3.2 配置优化器3.3 图片格式转化3.4 训练模型3.5 保存模型3.6 可视化 三、数据增强四、dropout 层五、参考资料 一、环…

Openresty原理概念篇(十五)Lua 规则和 NGINX 配置文件产生冲突怎么办?

一 Lua 规则和 NGINX 配置文件产生冲突怎么办? ① OpenResty 的名字和语言 说明&#xff1a; 了解openresty的发展史 ② 配置文件的规则优先级 1) 如何各司其职2) 都能满足功能,该如何取舍 理解&#xff1a; 1) rewrite ... break 到POST_WRITE阶段2) 而rewrite_by_lua*…

JAVA的DIFF算法

首先看一下我的文件结构 1.EnumType 类 public enum EnumType {ADD("ADD"),MODIFIED("MODIFIED"), DELETED("DELETED");//创建私有变量private String type;EnumType(String type) {this.type type;} }2.OperationType类 public class Operati…

vue封装svg组件来修改svg图片颜色

文章目录 1、引入依赖2、根目录的vue.config.js配置3、在组件文件夹(compontents)中创建svgIcon.vue4、在src目录下创建icons文件5、处理svg格式的图片6、在main.js文件中引入icons文件中的index.js文件7、使用8、效果图1、项目成功运行后的样子2、直接在html上添加样式&#x…