Go不能调用c++函数

Go can't call c++ function

我一直在使用 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 中的错误,还是我编写代码的方式有问题?根据 cgo documentation,支持 C++。我正在为 linux/amd64.

使用 Go 版本 1.7.5

非常感谢!

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

问题是 C++ 编译器使用 so-called "mangling" 作为从编译文件导出的符号。导出符号最初是 仅适用于 C-like 种语言,其中所有可以导出的都是普通语言 函数和变量,但 C++ 添加了 类 和函数重载, 并从编译的 ("object") 文件中导出这些符号,一个 C++ 编译器 需要 "mangle" 他们使用特定的模式来编码 类 的名称 以及这些名称中的参数类型。更糟糕的是,每个 C++ 编译器 品牌使用自己的修改模式。

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

如果你需要调用 "native" C++ 导出的东西,你需要使用 SWIG我估计。