Go无法调用c ++函数

时间:2017-02-15 17:59:45

标签: go cgo

我一直在使用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。

非常感谢!

1 个答案:

答案 0 :(得分:3)

我可能错了,但我认为cgo仅支持C ++,因为它知道如何在看起来像包含C ++源代码的非Go文件上调用C ++编译器,这就是全部。

问题是C ++编译器对从编译文件导出的符号使用所谓的"mangling"。最初导出符号 仅适用于类C语言,其中所有可导出的语言都是普通的 函数和变量,但C ++添加了类和函数重载, 并从编译(“对象”)文件,C ++编译器中导出这些符号 需要使用某种模式“破坏”它们来编码类的名称 和这些名称中的参数类型。更糟糕的是,每个C ++编译器 品牌使用自己的整修模式。

所以我认为虽然cgo能够编译C ++代码,但它有点假设 在C ++文件中导出的所有符号(由Go使用)都是 包含在extern "C" { ... }中(请参阅this)。

如果您需要调用“本机”C ++导出的东西,则需要使用 SWIG我估计。