编译时按架构排除go源文件

2023-11-25

我正在为 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”文件。


引用自构建约束文档:

构建约束是以指令 +build 开头的行注释,列出了文件应包含在包中的条件。约束可以出现在任何类型的源文件中(不仅仅是 Go),但它们必须出现在文件顶部附近,前面只能有空行和其他行注释。

为了区分构建约束和包文档,一系列构建约束后面必须跟有一个空行。

构建约束被评估为空格分隔选项的或;每个选项的计算结果是其逗号分隔项的 AND;每个术语都是一个字母数字单词,或者前面带有 ! 的否定词。也就是说,构建约束:

// +build linux,386 darwin,!cgo

对应布尔公式:

(linux AND 386) OR (darwin AND (NOT cgo))

一个文件可能有多个构建约束。总体约束是各个约束的“与”。也就是说,构建约束:

// +build linux darwin
// +build 386

对应布尔公式:

(linux OR darwin) AND 386

在特定的构建过程中,满足以下条件:

  • 目标操作系统,由runtime.GOOS拼写
  • 目标架构,由runtime.GOARCH拼写
  • 正在使用的编译器,“gc”或“gccgo”
  • “cgo”,如果 ctxt.CgoEnabled 为 true
  • “go1.1”,从 Go 版本 1.1 开始
  • ctxt.BuildTags 中列出的任何其他单词

如果文件名在去除扩展名和可能的 _test 后缀后,与以下任何模式匹配:

*_GOOS
*_GOARCH
*_GOOS_GOARCH

(示例:source_windows_amd64.go)或文字:

GOOS
GOARCH

(示例:windows.go)其中 GOOS 和 GOARCH 分别表示任何已知的操作系统和体系结构值,则该文件被视为具有需要这些术语的隐式构建约束。

要阻止某个文件被考虑用于构建:

// +build ignore

(任何其他不满意的词也可以,但“忽略”是约定俗成的。)

仅在使用 cgo 时且仅在 Linux 和 OS X 上构建文件:

// +build linux,cgo darwin,cgo

这样的文件通常与实现其他系统默认功能的另一个文件配对,在这种情况下,该文件将带有约束:

// +build !linux,!darwin !cgo

将文件命名为 dns_windows.go 将导致仅在为 Windows 构建包时才包含该文件;同样,仅在构建 32 位 x86 包时才会包含 math_386.s。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编译时按架构排除go源文件 的相关文章

随机推荐