2014-04-07 79 views
0

My Go软件包包含一个.c文件,该文件使用需要特定CFLAGS集的库。在命令行中“去安装”我可以指定CGO_CFLAGS所需的标志,并且一切正常。不过,我想这样做是为了让某人可以“获取”我的包并在不传递任何额外的命令行参数的情况下构建它。在Go包中持久地设置CGO_CFLAGS?

Go包装系统是否提供了一个我可以放置这样的配置的地方,以指定在包装时总是需要的一些参数?

(我知道围棋源文件做#cgo CFLAGS:指令,但记得,在我的包我有一个.c的源代码文件,所以需要CGO_CFLAGS设置为整个构建过程)

回答

5

CGO提取物你的#cgo CFLAGS:到构建期间的环境变量(通过“-x”标记到去构建)。如果你去安装-x你会发现它支持你的Go库中指定的cflags/ldflags。换句话说,它应该只是在Go文件中指定它们。

+0

@kdt,这在[文档](http://golang.org/cmd/cgo)中都有解释。 – kostix

+0

@Erikw谢谢,我不知何故知道我的.go文件中的选项没有被应用到.c文件,但你说得很对。 – kdt

0

为了使用您的任何C函数,你仍然有一些CGO混入你的。去的文件,这些文件只是声明你的标志,例如:

test.go:

package main 

import "fmt" 

/* 
#cgo CFLAGS: -DTEST 
#include <stdio.h> 
extern void ACFunction(); 
*/ 
import "C" 

//export AGoFunction 
func AGoFunction() { 
     fmt.Println("AGoFunction()") 
} 

func main() { 
     C.ACFunction() 
} 

test.c的:

#include "_cgo_export.h" 
void ACFunction() { 
#ifdef TEST 
     printf("ACFunction()\n"); 
#endif 
     AGoFunction(); 
} 

在同一目录下把这些都会让go build皮卡test.go定义的标志和建筑test.c.当他们申请

+0

只要注意,只要您不调用'AGoFunction',即使不包含'_cgo_export.h',它也可以工作。在编译当前包目录中的任何c文件时,Go将CFLAGS传递给编译器。 – photoionized