cgo使用libevent庫實現乙個定時器

2021-10-10 12:56:42 字數 1798 閱讀 9702

go和c互相呼叫指標

$ git clone 

$ cd libevent && mkdir build && cd build

$ cmake ..

$ make

// main.cpp

#include "event.h"

struct event ev;

struct timeval tv;

void time_cb(evutil_socket_t fd, short event, void *argc)

int main()

把編譯好的標頭檔案和庫檔案放到go工程裡

/go_libevent

├── libevent

├──├── include

├──├── lib

├── main.go

main.go

package main

/*#cgo cflags: -i $/libevent/include

#cgo ldflags: -l $/libevent/lib -levent -levent_core -levent_extra -lcrypto -lssl -lpthread

#include "event.h"

#include "event2/event.h"

typedef void(*cb)(evutil_socket_t, short, void *);

struct event evg;

struct timeval tvg;

struct event* geteventptr()

struct timeval* gettvptr()

void timer_cb(evutil_socket_t fd, short event , void* argc)

void ev_set_timer(struct event* evt, cb c)

*/import "c"

import (

"fmt"

"unsafe"

)func main()

呼叫libevent庫的 struct event:

c.struct_event
typedef void(*cb)(evutil_socket_t, short, void *);
libevent 中 有個巨集函式 evtimer_set

#define evtimer_set(ev, cb, arg)    event_set((ev), -1, 0, (cb), (arg))
cgo直接呼叫c.evtimer_set會報錯

could  not  determine  kind  of  name  for  c.evtimer_set
解決辦法是封裝一下

void ev_set_timer(struct event* ev, cb c)

然後呼叫方式為:

c.ev_set_timer()
go呼叫c code時,go傳遞給c code的go指標所指的go memory中不能包含任何指向go memory的pointer。

c呼叫的go函式不能返回指向go分配的記憶體的指標。

libevent庫的使用方法

接寫乙個很簡單的 time server 來當作例子 當你連上去以後 server 端直接提供時間,然後結束連線。event init 表示初始化 libevent 所使用到的變數。event set ev,s,ev read ev persist,connection accept,ev 把 s ...

cgo使用示例總結

main.go package main int plus int a,int b import c import fmt func main go mod init demo目錄結構 demo main.go go.mod c code test.h test.c test.go c code t...

cgo中呼叫C動態庫 靜態庫

include include include 包含header的目錄 cgo cflags i home leen header l指定所在目錄,支援絕對 相對路徑,l指定類庫名稱 去掉前面的lib及後面的.so,如libusbkey.so為 lusbkey 靜態庫方式 字尾名為.a 編譯時庫內容...