2014-12-05 44 views
1

讓我們將我的包工作區設爲github.com/yada/yada第三方包。在這個包裏面有一個我想重用的yoda.go.h頭文件(不確定它是個好主意,但這是一個新的問題)。我如何從一個依賴包導入到我自己的包中?如何在Go中包含來自第三方包的頭文件?

package main 

// #cgo pkg-config: my-dep other-dep 
// #include <someHeader.h> 
// #include <otherHeader.h> 
// #include github.com/yada/yada/yoda.go.h // doesn't work :(
import "C" 

除了是一個好主意或不是,我仍然想知道是否有可能。 PS:如果你認爲這是一個不好的主意,我該怎麼做呢?

回答

1

使用CGO CFLAGS指令來引用其他包含路徑。

//#cgo CFLAGS: -I $GOPATH/src/github.com/yada/yada/ 
... 
//#include "yoda.go.h" 
import "C" 

修正

轉到工具不會生成過程中擴大$ GOPATH變量。相反,應該在那裏使用完整路徑。更正後的代碼:

//#cgo CFLAGS: -I /full/path/to/src/github.com/yada/yada/ 
//#include "yoda.go.h" 
+0

嘿,很聰明。我會接受這個問題,因爲它更直接地解決了這個問題,但是這兩個答案都是非常豐富的。 – marcio 2014-12-05 18:10:20

+0

@marcioAlmada:哈,這就是我通過直接在文件系統中引用標題的意思。以爲你已經全部理清了;) – JimB 2014-12-05 19:18:08

+0

對不起@JimB我認爲「直接在文件系統中」意味着將頭文件複製並粘貼到可見度爲xD的地方 – marcio 2014-12-05 22:36:19

1

嘗試直接引用它可能不是一個好主意,因爲它不是導出的實體,並且可能會更改或刪除。

如果你真的需要這個頭文件,你必須直接在你的本地文件系統中引用它。 (當然,您也可以自由複製到您的項目中)

+0

標頭位於已標記的發行版上,因此使用它似乎很安全。 – marcio 2014-12-05 13:50:00

+0

我傾向於接受你的答案(+1)並將頭文件複製到我的包中......但在此之前,有沒有辦法在GO中包含C代碼而不使用頭文件? (只是內聯嗎?) – marcio 2014-12-05 13:51:18

+1

這取決於你如何安全地使用它。由於標題不能導出任何內容,因此不能保證它會按原樣重新導入。這與使用反射來讀取一些未導出的值類似,這些值可能會更改而不會影響公共API。 – JimB 2014-12-05 13:52:15

相關問題