c++ 如何在Golang中使用Libevent?(Golang DLL)

disho6za  于 2022-12-20  发布在  Go
关注(0)|答案(1)|浏览(180)

我需要帮助在Golang与C++。

项目历史记录:

1.我有一个C应用程序的游戏超过10年。
1.现在我试着用Golang改写它。
1.我发现旧的使用libEvent,我尝试将c
打包成DLL,并在Golang中使用DLL。

发行日期:

当我尝试使用代码时,例如:
在Cpp-DLL中

event * Go_event_new(struct event_base *, event_callback_fn, void *)

在戈兰

m_pRpcEvent := api.Cpp_event_new(uintptr(p.PROP_m_pEventBase), uintptr(rpcFunc), uintptr(this))

**它返回错误并造成内存泄漏。

我能为LibEvent做些什么?

ujv3wf0j

ujv3wf0j1#

要在Golang中使用libent,可以使用cgo工具,它允许你从Go语言中调用C代码,下面是一个例子,说明你如何在Go语言中使用libent:
1.首先,你需要安装libevent和它的开发文件,在Debian或Ubuntu上,你可以通过运行sudo apt-get install libevent-dev来完成,在其他系统上,你需要使用包管理器或从源代码构建来安装libevent。
1.接下来,你需要创建一个Go语言文件,在文件的顶部包含一个#cgo指令,该指令告诉cgo工具编译并链接它后面的C代码,下面是一个例子来说明你应该如何做:

package main
/*
#cgo LDFLAGS: -levent
#include <event2/event.h>
#include <stdlib.h>

static void cb(evutil_socket_t fd, short what, void *arg) {
  printf("fd = %d, what = %hd, arg = %p\n", fd, what, arg);
}

static struct event_base *base;
static struct event *ev;

int start_event_loop() {
  base = event_base_new();
  if (!base) return -1;

  ev = event_new(base, STDIN_FILENO, EV_READ|EV_PERSIST, cb, NULL);
  if (!ev || event_add(ev, NULL)<0) return -1;

  return event_base_dispatch(base);
}

void stop_event_loop() {
  event_base_loopbreak(base);
}
*/
import "C"

import (
    "fmt"
    "os"
    "os/signal"
    "syscall"
)

func main() {
    // Set up a signal handler to stop the event loop when we receive a signal
    signalChan := make(chan os.Signal, 1)
    signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM)
    go func() {
        <-signalChan
        C.stop_event_loop()
    }()

    // Start the event loop
    if C.start_event_loop() < 0 {
        fmt.Println("Failed to start event loop")
        os.Exit(1)
    }
}

1.在上面的例子中,#cgo指令告诉cgo工具在编译Go代码时链接-levent库;#include指令告诉cgo在编译C代码时包含指定的头文件; import“C”行告诉cgo在最终的二进制文件中包含它后面的C代码。

相关问题