【发布时间】:2017-06-23 10:39:16
【问题描述】:
我在C 中有一个外部函数:
//extern void goCallback(const struct libvlc_event_t*, void*);
在go中定义:
//export goCallback
func goCallback(event unsafe.Pointer, userData unsafe.Pointer) {
log.Fatal("TODO goCallback")
}
编译代码时出现类型冲突错误
# github.com/tarrsalah/libvlc-go
In file included from $WORK/github.com/tarrsalah/libvlc-go/_obj/_cgo_export.c:3:0:
cgo-gcc-export-header-prolog:42:13: error: conflicting types for ‘goCallback’
In file included from $WORK/github.com/tarrsalah/libvlc-go/_obj/_cgo_export.c:3:0:
../../../tarrsalah/libvlc-go/event_manager.go:6:13: note: previous declaration of ‘goCallback’ was here
//extern void goCallback(const struct libvlc_event_t*, void*);
^~~~~~~~~~
/tmp/go-build855229382/github.com/tarrsalah/libvlc-go/_obj/_cgo_export.c:17:6: error: conflicting types for ‘goCallback’
void goCallback(void* p0, void* p1)
^~~~~~~~~~
In file included from $WORK/github.com/tarrsalah/libvlc-go/_obj/_cgo_export.c:3:0:
../../../tarrsalah/libvlc-go/event_manager.go:6:13: note: previous declaration of ‘goCallback’ was here
//extern void goCallback(const struct libvlc_event_t*, void*);
^~~~~~~~~~
什么是go 等价于const struct libvlc_event_t*?
【问题讨论】:
-
编译器抱怨因为函数
goCallback在C和Go中都定义了。当您希望从C访问您的go函数时,需要//export ...。如果你想使用go中的C函数,//extern void ...就足够了。 -
看看github.com/golang/go/wiki/cgo#function-variables,我做对了,从
c访问go需要//extern declaration和//export comment。 -
对不起,我误解了你的问题。编译器抱怨,因为有两个
goCallback具有不同签名的函数。我写了一个答案,希望对您有所帮助。