我一直在使用cgo来连接Go和C.但是,当尝试为Go和C ++做同样的事情时,每次尝试调用函数时都会出现编译错误。使用代码目录中的go build .
,我收到以下错误:
./main.go: In function 'void _cgo_3612c872201c_Cfunc_getint(void*)':
./main.go:48:53: error: invalid conversion from 'void*' to '_cgo_3612c872201c_Cfunc_getint(void*)::<anonymous struct>*' [-fpermissive]
./main.go:54:4: error: invalid conversion from 'void*' to '_cgo_3612c872201c_Cfunc_getint(void*)::<anonymous struct>*' [-fpermissive]
我在下面放了一个简单的例子来说明问题。
main.go:
package main
/*
#cgo CFLAGS: -x c++
int getint()
{
return 1;
}
*/
import "C"
import (
"fmt"
)
func main() {
fmt.Println(C.getint())
}
有谁知道这是否是cgo中的错误,或者我编写代码的方式有问题?根据{{3}},支持C ++。我使用Go版本1.7.5 for linux / amd64。
非常感谢!
答案 0 :(得分:3)
我可能错了,但我认为cgo
仅支持C ++,因为它知道如何在看起来像包含C ++源代码的非Go文件上调用C ++编译器,这就是全部。
问题是C ++编译器对从编译文件导出的符号使用所谓的"mangling"。最初导出符号 仅适用于类C语言,其中所有可导出的语言都是普通的 函数和变量,但C ++添加了类和函数重载, 并从编译(“对象”)文件,C ++编译器中导出这些符号 需要使用某种模式“破坏”它们来编码类的名称 和这些名称中的参数类型。更糟糕的是,每个C ++编译器 品牌使用自己的整修模式。
所以我认为虽然cgo
能够编译C ++代码,但它有点假设
在C ++文件中导出的所有符号(由Go使用)都是
包含在extern "C" { ... }
中(请参阅this)。
如果您需要调用“本机”C ++导出的东西,则需要使用 SWIG我估计。