其他分享
首页 > 其他分享> > Golang 编译约束/条件编译

Golang 编译约束/条件编译

作者:互联网

通常对程序进行编译的时候,可能带一些条件(如不同平台、架构有不同的代码实现),让编译器只对满足条件的代码进行编译,将不满足条件的代码舍弃,这就是条件编译。golang中,称之为编译约束,进行编译约束的方式有2种分别:

编译标签 (build tag)

在源码文件顶部添加注释,来决定文件是否参与编译

// +build <tags>

说明:

标签可以指定为以下内容:

例如,编译条件为(linux AND 386) OR (darwin AND (NOT cgo))

// +build linux,386 darwin,!cgo

另外一个文件可以有多个编译约束,比如条件为(linux OR darwin) AND amd64

// +build linux darwin
// +build amd64

也可以将一个文件从编译中排除,使用ignore标签。

// +build ignore

注意:// +build的下一行必须是空行。

// +build linux

// main package comment
package main

下面的写法不会识别为build tag,而会解析为包注释:

// +build linux
package main

文件后缀

除了编译标签,编译器也会根据文件后缀来自动选择编译文件,格式如下:

$filename_$GOOS.go
$filename_$GOARCH.go
$filename_$GOOS_$GOARCH.go

如在项目中有tcp.gotcp_linux_x86.go 两个文件,执行:

GOOS=linux GOARCH=x86 go build

将选择 tcp_linux_x86.go进行编译,而执行:

GOOS=linux GOARCH=x86 go build

选择tcp.go进行编译。

利用ldflags在编译过程中为变量赋值

本节为附加说明,不属于条件编译的范畴。有时我们需要在编译过程中为变量赋值,此时可以利用ldflags参数完成。ldflagsgo build的一个参数,使用方式如下:

go build -ldflags "-w -s -X main.Version=${VERSION} -X github.com/demo/version.BuildNo=${BUILD_NO}"

参数说明:

-w 删除DWARF信息:编译出来的程序无法用gdb进行调试。

-s 删除符号表:panic的stack trace没有文件名/行号信息,等价于C/C++程序被strip。

-X 替换包中的变量的值。

加上-w -s可以有效减少编译出来地程序的大小,但不利于进行调试和日志追踪。

参考文章

本文转载自:Golang 编译约束/条件编译 | Bang (oskip.com)

标签:约束,Golang,编译,GOARCH,build,linux,go,GOOS
来源: https://www.cnblogs.com/FengZeng666/p/15689046.html