如何在Go中包含来自第三方包的头文件?

问题描述:

让我们将我的包工作区设为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:如果你认为这是一个不好的主意,我该怎么做呢?

使用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

尝试直接引用它可能不是一个好主意,因为它不是导出的实体,并且可能会更改或删除。

如果你真的需要这个头文件,你必须直接在你的本地文件系统中引用它。 (当然,您也可以*复制到您的项目中)

+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