一、编译标签
在文件头部添加一行注释 +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