2017-02-15 128 views
0

我一直在使用cgo來連接Go和C.但是,當試圖對Go和C++執行相同操作時,每次嘗試調用函數時都會收到編譯錯誤。從代碼的目錄使用go build .,我得到以下錯誤:Go無法調用C++函數

./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一個bug,或有點毛病我怎麼寫的代碼?根據cgo documentation,支持C++。我爲Linux/amd64使用Go版本1.7.5。

非常感謝!

回答

0

我可能是錯的,但我認爲cgo只支持C++,因爲它知道如何在看起來像包含C++源代碼的非Go文件上調用C++編譯器,就這些了。

問題是,C++編譯器使用所謂的"mangling"作爲從編譯文件導出的符號。導出符號最初是 ,僅適用於C語言,其中所有可以導出的都是普通的函數和變量,但C++增加了類和函數重載,並且從編譯(「對象」)文件中導出這些符號, C++編譯器 需要使用某些模式對它們進行「破壞」,以編碼類名稱 以及這些名稱中的參數類型。更糟糕的是,每個C++編譯器 品牌都使用自己的mangling架構。

所以我覺得雖然cgo能夠編譯C++代碼,它像是假定 所有符號出口(被轉到被使用),在C++文件 包裹在extern "C" { ... }(見this)。

如果你需要調用「本地」C++導出的東西,你需要使用 SWIG我認爲。

+0

哦,這很有道理!非常感謝你的幫助! –