我正在为Windows编写一个Go程序,其中包含几个包。其中一个包是使用CGo调用一些.h和.c文件中定义的几个函数。这些.c文件依赖于windows.h。
由于在Windows平台上开发非常繁琐,所以我想对这个文件中的函数做一个模型,然后在Linux上进行开发。但是,当我试图编译时,我得到:
fatal error: windows.h: No such file or directory
因为go工具试图编译我的Windows相关文件。有办法绕过这件事吗?我知道把一些东西放在
#ifdef ..
import x
#endif
这不是最佳实践,但在这种情况下,我需要一些东西来允许只编译"Linux“文件。
发布于 2013-09-02 03:09:53
引用构建约束文档:
build约束是以指令+build开头的行注释,它列出了包中应该包含文件的条件。约束可能出现在任何类型的源文件中(不仅仅是Go),但是它们必须出现在文件顶部附近,前面只有空行和其他行注释。 要将生成约束与包文档区分开来,必须在一系列生成约束后面加上一个空行。 build约束被计算为空格分隔选项的or;每个选项计算为其逗号分隔的术语的和;每个术语是字母数字词,或者,前面是它的否定词。也就是说,构建约束:
// +build linux,386 darwin,!cgo
对应于布尔公式:
(linux AND 386) OR (darwin AND (NOT cgo))
一个文件可能有多个构建约束。总体约束是单个约束的约束。也就是说,构建约束:
// +build linux darwin
// +build 386
对应于布尔公式:
(linux OR darwin) AND 386
在特定的构建过程中,满足以下几个字:
如果在去掉扩展名和可能的_test后缀后,文件的名称与下列任何模式相匹配:
*_GOOS
*_GOARCH
*_GOOS_GOARCH
(例如: source_windows_amd64.go)或文字:
GOOS
GOARCH
(例如: windows.go),其中GOOS和GOARCH分别代表任何已知的操作系统和体系结构值,那么文件被认为具有一个要求这些术语的隐式构建约束。 若要防止文件被考虑用于生成,请执行以下操作:
// +build ignore
(任何其他不满意的词也会起作用,但“忽略”是传统的。) 仅在使用cgo时,并且仅在Linux和OS上构建文件:
// +build linux,cgo darwin,cgo
这样的文件通常与实现其他系统的默认功能的另一个文件配对,在这种情况下,该文件带有约束:
// +build !linux,!darwin !cgo
命名一个文件dns_windows.go只会导致它只在构建用于math_386.s的包时包含;类似地,只有在为32位x86构建包时才会包含math_386.s。
https://stackoverflow.com/questions/18571661
复制相似问题