Skip to content

Instantly share code, notes, and snippets.

@jouyouyun
Created January 20, 2014 09:50
Show Gist options
  • Save jouyouyun/8517565 to your computer and use it in GitHub Desktop.
Save jouyouyun/8517565 to your computer and use it in GitHub Desktop.
cgo test
#include "test.h"
void SetFunc()
{
InternalFunc();
}
package main
// #include "test.h"
import "C"
import "fmt"
var function func()
//export InternalFunc
func InternalFunc() {
function()
}
func Register(fnct func()) {
function = fnct
C.SetFunc()
}
func test() {
fmt.Println("How should I do it")
}
func main() {
Register(test)
}
#ifndef __TEST_H__
#define __TEST_H__
void SetFunc();
extern void InternalFunc();
#endif
@oliveagle
Copy link

2 problems.

  • test.c missing #include "_cgo_export.h"
#include "test.h"
#include "_cgo_export.h"

void SetFunc()
{ 
    InternalFunc();
}

我理解_cgo_export.h 能让 C 代码访问 Go 导出的方法。 并且只能在go代码中不能直接被引入的地方。go build 先把 test.go 用cgo编译成 _obj 。如果 _cgo_export.h 在 test.h 中 (test.go中直接 include的 test.h) 或者直接在 test.go 中, 可是这时候, 这个 _cgo_export.h 还没有被cgo生成。所以会编译报错说找不到_cgo_export.h

  • void InternalFunc(); in test.h is enough
$ cat test.c 
#include "test.h"
#include "_cgo_export.h"

void SetFunc()
{ 
    InternalFunc();
}                                                                                   

$ cat test.h
void SetFunc();
// extern void InternalFunc();
void InternalFunc();                                                                

$ go build  

$ ./1 
How should I do it

extern void InternalFunc(); 中的extern完全没有必要。表面但原因是: 这里就是纯粹的cgo 调用C的方法。。。 官方文档没有说要用extern才能掉到吧。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment