Jump to Navigation

由windows上链接现象不同引出的golang CGO跨平台用法总结

由windows上链接现象不同引出的golang CGO跨平台用法总结

在开发一个项目时,碰到一种用法,是在C++中调用go编写的静态库,而在go中又需要回调C++函数。

1、第一种解决办法,简单方式(后来证明windows上不支持)

这种方式,就是在C++中实现了这个函数之后,在go中extern一下这个函数,

在go源代码中就可以直接调用这个函数了。

注:当然这里的函数签名要用extern "C"声明的,否则在go中无法调用到。

这种有一个问题,不能用在windows上,windows上在链接静态库时,必须要所有的符号都存在,

而前面提到的是extern方式,实际符号并不存,导致编译失败。

2、第二种办法,通用方法,但比较繁索一点。好像这是唯一可行的跨平台的通用方式了。

在go代码中声明一个函数指针,和一个设置该函数指针值的函数,和一个调用该函数指针的函数,例如,

static void (*cbfn)();

void set_cbfn(void *f) {
   cbfn = (void(*)())f;
}

void call_cbfn() {  cbfn(); }

在go中使用, C.call_cbfn()

所以搞跨go与c的回调还是挺麻烦的。在回调函数场景少的项目还可以使用的。

Category:

添加新评论

Plain text

  • 不允许HTML标记。
  • 自动将网址与电子邮件地址转变为链接。
  • 自动断行和分段。
CAPTCHA
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.
Image CAPTCHA
Enter the characters shown in the image.


Main menu 2

Story | by Dr. Radut