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 編譯時庫內容...