Golang交叉编译

时间:2024-10-13 08:03:48

交叉编译

简介

        交叉编译是指在一个平台编译另一个平台的代码,如:Windows上面编译Linux平台的代码。
        通常情况下某平台编译的代码只有该平台能够运行访问,若拷贝到其他平台可能会因为无法识别文件格式而无法运行。欲使代码能够在目标平台运行,只能专门编写面向目标平台的代码并在该平台编译,这虽然能够实现目的,但毫无疑问跨平台性肯定是非常差的。
        Golang本身支持根据文件名后缀如:xxx _linux_amd64.go这种格式表示linux平台amd64 CPU架构,当Go的环境变量(命令go env可查看和修改Go环境变量)设置为GOOS = linuxGOARCH = amd64时会选择上述后缀的文件进行编译,而类似 xxx _windows_amd64.go之类的其他平台或其他CPU架构的文件反而不会被编进二进制,不管当前代码在哪个平台,只要设置了Go环境变量,就能够编译出目标平台目标CPU架构的二进制,从而也能够在目标平台上面运行。Go的这种支持从代码和编译的层面体现出了良好的跨平台性,而非编译后的二进制体现出来的跨平台性。

示例

        创建两个带后缀分别为 _windows._linux.的文件,两个文件创建在同一个目录下,且存在相同的全局常量函数名。正常情况下同一个包中不能存在相同的全局变量、常量、函数名,不然会报重定义的错误,但文件加了上述后缀却可以。这是因为这两种文件被识别为两种不同平台的文件,在编译的时候这两种文件是不会被同时编译进二进制,而是选择性地匹配Go环境变量中的GOOS和GOARCH,满足匹配条件的才会编进二进制中,因此不存在冲突的问题。
在这里插入图片描述

结果

1、Go环境变量:windows平台、amd64 CPU架构
在这里插入图片描述
在Windows中运行得到结果:
在这里插入图片描述
在Linux平台中运行得到结果:
在这里插入图片描述

2、Go环境变量:linux平台、amd64 CPU架构
在这里插入图片描述
在Windows中运行得到的结果:
在这里插入图片描述
如上图,该二进制编译出来在Windows平台无法识别为可执行文件。
在Linux平台中运行得到的结果:
在这里插入图片描述
如上图,该二进制在Linux平台可识别为可执行文件。

编辑器(此处只介绍Goland)

        如果项目中存在如上格式的指明平台、CPU架构的后缀,则开发工具也会有一定的适配。
在这里插入图片描述
如上图,若文件后缀指定平台或CPU架构与Goland本身的设置不匹配,则会有如上的提示信息,此时根据需要设置即可。
在这里插入图片描述
tip:如果代码并没有平台、CPU架构的分别,那么也就不需要上述指明平台、CPU架构的后缀,只设置Go环境变量目标平台和CPU架构即可编出对应的二进制,从而在目标平台上运行。上述文件后缀实际上已经属于条件编译的范畴了,并非交叉编译必须的步骤。