转载本文请联系网管谢bi公众号。最近调研了某APM厂商的Goprobe程序,说通过引入一个包,就可以将probe引入到项目中,全程不需要修改其他代码。没想到我第一次引入包,尝试搭建的时候就翻车了。main.go:10:2:buildconstraintsexcludeallGofilesin/xxx/github.com/xxx/agnet/xxxx编译器在编译时直接排除了某个包下的所有文件。这是什么意思?意思是这个包下没有当前构建环境中构建的Go文件。猜测应该是这个包源码的build标签声明了不允许在Mac环境下构建。打开源码看看。事实上,所有文件的构建标签都是以这种方式声明的。//+buildlinux//+buildamd64这个叫做条件编译,或者约束编译。那么在Mac下想编译一个只能在Linux上运行的可执行文件怎么办呢?Go还支持一种称为交叉编译的功能,即用于跨平台编译。具体如何使用,比如本例中,需要在Mac环境下编译一个Linux系统amd64架构下可以运行的可执行文件,所以要编译:CGO_ENABLED=0GOOS=linuxGOARCH=amd64gobuildmain.go不过我以后想研究为什么不让它在Mac上编译呢?看了这个包的probe,是用CGO实现的,在linux系统下调用了一个用C语言实现的工具命令。看到这里,我也不想再继续研究这个包了,所以为了让这篇文章不那么明显:),我们再回顾一下Go语言的交叉编译和条件编译这两个知识点。交叉编译交叉编译用于为另一个平台生成一个平台上的可执行程序。Go的命令集原生支持交叉编译,使用方法非常简单。比如上面已经演示过的CGO_ENABLED=0GOOS=linuxGOARCH=amd64gobuildmain.go参数说明。CGO的GOOS不能在GOOS中使用:目标平台mac对应darwinlinux对应linuxwindows对应windowsGOARCH:目标平台的架构[386,amd64,arm],目前市面上的个人电脑一般都是amd64的386架构,也叫x8632位操作系统amd64也叫x64,对应64位操作系统arm。这种架构一般用于嵌入式开发。比如Android、IOS、Winmobile、TIZEN等。了解了这些参数之后,我们再来看Mac、Linux、Windows三个平台交叉编译的例子。我没有尝试,因为我家境不好,条件不好。不过,我是在网上找到的。如有错误,请在评论中留言,帮助我更正。Mac下编译,Linux或Windows的可执行程序#linux可执行程序CGO_ENABLED=0GOOS=linuxGOARCH=amd64gobuildmain.go#Windows可执行程序CGO_ENABLED=0GOOS=windowsGOARCH=amd64gobuildmain.goLinux下编译,Mac或Windows上执行#Mac平台可执行程序CGO_ENABLED=0GOOS=darwinGOARCH=amd64gobuildmain.go#Windows可执行程序CGO_ENABLED=0GOOS=windowsGOARCH=amd64gobuildmain.go在Windows下执行,在Mac或Linux下执行,需要写一个批处理程序在里面设置,因为在Windows下是终端做的不支持shell,这点和Mac、Linux有点区别。#Mac执行SETCGO_ENABLED=0SETGOOS=darwinSETGOARCH=amd64gobuildmain.go#Linux执行SETCGO_ENABLED=0SETGOOS=linuxSETGOARCH=amd64gobuildmain.go条件编译交叉编译只是针对一个平台编译可以在其他平台运行的程序。Go是跨平台的语言,它提供的类库也必须是跨平台的。比如程序的系统调用相关的函数,可以根据环境编译出相应的源码。.让编译器只编译满足条件的代码,丢弃不满足条件的代码。这是另一个概念,叫做条件编译。在Go中,它也被称为BuildConstraints。添加构建约束的方式有两种:构建标签(buildtag)文件后缀buildtagbuildtag是一种在源代码文件顶部添加注释的方式,用来判断文件是否参与编译的Constraints。其格式如下://+build
