Go语言之条件编译

Golang Conditional Compilation

Posted by alovn on May 30, 2021

一、编译标签

在文件头部添加一行注释 +build 用来指定编译条件。注意:+build 后必须留一行空格,否则会报重定义的错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// demo1.go
// +build demo1

package main
func Do(){
    fmt.Println("demo1")
}

// demo2.go
// +build demo2

package main
func Do(){
    fmt.Println("demo2")
}

// main.go:
package main
func main(){
    do()
}

在运行或编译的时候指定 -tags 参数:

1
2
go run --tags=demo1 .
go build --tags=demo1 .

+build 特殊注释还支持使用表达式:

1
2
// +build !a
// +build a && b

二、文件后缀

通过特定文件后缀指定这个源文件只会在这个平台架构下编译, 格式为:

xx_$GOOS.go
xx_$GOARCH.go
xx_$GOOS_$GOARCH.go

//例如:
xx_linux.go
xx_amd64.go
xx_freebsd_386.go

文件命名约定可以在go源码build包里找到详细的文档说明,使用这种方案比编译标签要简单一些,它可以在不读取源文件的情况下就决定哪些文件是否需要参加编译。

不能忽略掉文件名,而直接使用_linux.go、_freebsd_386.go,因为编译时将会忽略所有以下划线或者点开头的源文件。

CGO

如果你的代码中用到了CGO,可以使用如下的方式指定对应的系统架构实现条件编译:

1
2
3
4
5
#cgo linux LDFLAGS: -Wl,-rpath="./lib:./:/usr/local/ffmpeg/lib:/usr/lib64:/usr/lib"
#cgo linux CFLAGS: -I/usr/local/ffmpeg/include
#cgo linux LDFLAGS: -L/usr/local/ffmpeg/lib -lavcodec -lavformat -lavutil -lswscale -lswresample -lavdevice -lavfilter
#cgo darwin CFLAGS: -I/usr/local/Cellar/ffmpeg/4.3.2_3/include
#cgo darwin LDFLAGS: -L/usr/local/Cellar/ffmpeg/4.3.2_3/lib -lavcodec -lavformat -lavutil -lswscale -lswresample -lavdevice -lavfilter