cgo-libevent-for-windows

  • cgo-libevent-for-windows

    • 参考文章:
    • 1.环境(windows)
    • 2.下载libevent源码 并制作dll动态库 利用mingw-utils生成.a .def
    • 3.测试代码:
    • 4.go build:

参考文章:

https://www.kancloud.cn/idzqj/customer/2026575
https://www.cnblogs.com/pandamohist/p/14227440.html

1.环境(windows)

安装文件和具体文档都在setup文件夹中

go 1.13
libevent 2.1.10
cmake 3.22
mingw && mingw-utils
visualstudio 2013/2017
openssl

2.下载libevent源码 并制作dll动态库 利用mingw-utils生成.a .def

根据libevent编译手册操作即可

mingw-utils命令:

    pexports libevent.dll > libevent.defdlltool.exe -D libevent.dll -d libevent.def -l libevent.a -kpexports libevent_core.dll > libevent_core.defdlltool.exe -D libevent_core.dll -d libevent_core.def -l libevent_core.a -kpexports libevent_extra.dll > libevent_extra.defdlltool.exe -D libevent_extra.dll -d libevent_extra.def -l libevent_extra.a -k

3.测试代码:

package main/*
#cgo CFLAGS: -I ${SRCDIR}/include
// 不把lib的资源放lib文件夹的原因是启动的时候,会判断dll是否存在
#cgo LDFLAGS: -Wl,--allow-multiple-definition -L${SRCDIR} -levent -levent_core -levent_extra
#include <Windows.h>
#include <stdio.h> // for c.puts
#include <string.h>
#include <errno.h>
#include <stdio.h>
#include <signal.h>
#include <WinSock2.h>
#include <stdint.h>
#include "event.h"
#include "event2/bufferevent.h"
#include "event2/buffer.h"
#include "event2/listener.h"
#include "event2/util.h"typedef void(*cb)(evutil_socket_t, short, void *);struct event evg;
struct timeval tvg;struct event* getEventPtr()  {return &evg;
}struct timeval* getTvPtr()  {tvg.tv_sec = 1;tvg.tv_usec = 0;return &tvg;
}void timer_cb(evutil_socket_t fd, short event , void* argc) {struct timeval tv;tv.tv_sec = 2;tv.tv_usec = 0;printf("timer wakeup\n");struct event* ev = (struct event*)argc;event_add(ev, &tv); // reschedule timer
}void ev_set_timer(struct event* evt, cb c)
{evtimer_set(evt, c, (void*)evt);
}
*/
import "C"
import ("fmt""unsafe"
)func main() {C.puts(C.CString("cgo-libevent-for-windows"))var pev *C.struct_event = C.getEventPtr()var ptv *C.struct_timeval = C.getTvPtr()var base *C.struct_event_basebase   = C.event_base_new()  //*C.struct_event_basevar pbase *C.struct_event_base  = (*C.struct_event_base)(unsafe.Pointer(base))C.ev_set_timer(pev, (C.cb)(unsafe.Pointer(C.timer_cb)))C.event_base_set(pbase, pev)C.event_add(pev, ptv)C.event_base_dispatch(pbase)C.event_base_free(pbase)Pause()
}func Pause() {var str stringfmt.Println("")fmt.Print("请按任意键继续...")fmt.Scanln(&str)fmt.Print("程序退出...")
}

4.go build:

常见错误:cgo_libevent_for_windows cc1.exe: sorry, unimplemented: 64-bit mode not compiled in

windows命令行:SET CGO_ENABLED=1SET GOOS=windowsSET GOARCH=386SET GO111MODULE=offgo build -xgoland编译器:goland-environment:CGO_ENABLED=1;GOOS=windows;GOARCH=386

5.github地址:

https://github.com/zld126126/cgo_libevent_for_windows

6.效果

[Go实战]CGO 入门系列-手把手教程4 调用 libevent (c语言类库)为案例相关推荐

  1. [Go实战]CGO 入门系列-手把手教程3 调用 mysql (c语言类库)为案例

    cgo-mysql-for-windows 1.安装环境 2.编译 && 运行 2.1 dll 编译 def 2.2 def && dll 编译 a 2.3 编译运行e ...

  2. [Go实战]CGO 入门系列-手把手教程1

    CGO 入门系列-手把手教程1 背景 CGO设置 简单的调用 && 测试 运行报错: 报错问题: 解决: 解决方案1:goland启动设置 解决方案2:环境设置(win/linux) ...

  3. php 枚举类型比较,枚举的比较-python编程入门系列图文教程-PHP中文网教程

    因为枚举成员不是有序的,所以它们只支持通过标识(identity) 和相等性 (equality) 进行比较.下面来看看 == 和 is 的使用:#!/usr/bin/env python3 # -* ...

  4. python编程怎么命名_命名规范-python编程入门系列图文教程 - Python学习网

    命名规范命名规范 1.模块 模块尽量使用小写命名,首字母保持小写,尽量不要用下划线(除非多个单词,且数量不多的情况) # 正确的模块名 import decoder import html_parse ...

  5. php元类,什么是元类-python编程入门系列图文教程-PHP中文网教程

    通过上面的介绍,终于模模糊糊的带到元类这里来了.可是我们到现在还不知道元类是什么东东. 我们创建类的时候,大多数是为了创建类的实例对象.那么元类呢?元类就是用来创建类的.也可以换个理解方式就是:元类就 ...

  6. wxpython视频教程-单片机C语言入门_单片机教程_单片机编程语言 - C语言网

    本教程由 继承叔 编写,面向对单片机有基础认知的初学者! 1.单片机了解 单片机是一块集成电路的控制芯片,我们熟知的家电例如洗衣机的定时控制和滚筒运作,电饭煲的保温功能和鸣叫提醒,电冰箱,空调等等这些 ...

  7. Python编程入门系列课程

    原文:https://mc.dfrobot.com.cn/thread-309195-1-1.html Python编程入门系列课程--教程目录: Python编程入门系列课程--01 智能绘星 Py ...

  8. Go 语言入门系列:基本语法介绍之变量的声明与初始化

    各位同学端午安康! 前文回顾 前面的文章介绍了 Go 相关的特性与入门案例,对于一门编程语言,变量和语法是我们首先需要掌握的.Go 在语法上与 C 语言有很多相似支持,但是比 C 语言更加简约.如果你 ...

  9. RPA之家手把手带你入门Blue Prism教程系列 -汇总

    RPA之家手把手带你入门Blue Prism 基础篇 -本文章由RPA之家(rpazj.com)提供, 学习交流群QQ群465620839 微信交流群: 基础篇 RPA之家手把手带你入门Blue Pr ...

最新文章

  1. ASP.NET AJAX环境的简单构建(ZT)
  2. 超好用的C#控制台应用模板
  3. JavaFX鼠标移动事件
  4. 9000.消息中间件MQTT
  5. 《数据分析实战 基于EXCEL和SPSS系列工具的实践》一3.2 用“逐步推进法”推测需要的数据...
  6. 读取脑磁波,神经网络知道你在「犹豫不定」
  7. Linux 设置 LD_LIBRARY_PATH
  8. 问题二十五:为什么有时候XnView无法显示PPM图片?
  9. Linux设备驱动程序学习 高级字符驱动程序操作[阻塞型I/O和非阻塞I/O]【转】
  10. js文本框设置必填项_input必填_js 检验必填项的代码
  11. 倍福---Profinet主从通信
  12. 英特尔服务器主板型号,支持英特尔® Server Board S2600JF
  13. 保险渠道的两极之路——保险新渠道(一)
  14. wan端口未连接怎么弄_路由器WAN口未连接解决方法,WAN口未连接怎么办
  15. Visual Studio 2010——C#的主菜单的使用
  16. 数字通信第三章——多维信号传输
  17. 如何将MP4视频文件转换成GIF动态图片
  18. 京东员工被裁后哀叹:优化后连面试的机会都没有,每月还要还贷款
  19. 《大象:thinking in uml 》(第二版) 3章 UML核心元素 3节 用例
  20. 做时间的记录者—手机摄影达人20天养成计划

热门文章

  1. 『网络迷踪』ctfshow-网络迷踪(部分)
  2. CDH平台YARN日志查看和问题排查
  3. 【转】SCI论文写法攻略
  4. 微信小程序如何隐藏左上角返回首页按钮?
  5. GPT模型介绍并且使用pytorch实现一个小型GPT中文闲聊系统
  6. 微信H5手机网页开发—快速入门
  7. (转)go rabbitmq实践
  8. 网站怎么备案?如何快速通过网站备案?网站快速备案攻略请查收!
  9. b站弹幕姬python_B站弹幕姬()分析与开发(下篇)
  10. 诗鬼李贺:只活27岁,让我们争吵千年