go程序执行交叉编译的流程步骤

 更新时间:2024年07月10日 08:29:15   作者:楽码  
go程序可用通过交叉编译的方式在一个平台输出多个平台可运行的二进制包,本文给大家详细介绍了go程序执行交叉编译的流程步骤,文中有详细的代码示例供大家参考,需要的朋友可以参考下

1 简介

go程序可用通过交叉编译的方式在一个平台输出多个平台可运行的二进制包。

交叉编译示意图:

两个方式分别为使用cgo的交叉编译和不使用cgo的交叉编译。无需CGO时,直接使用Go的跨平台支持编译。

设置环境变量如GOOS, GOARCH, CGO_ENABLED来执行编译,例如CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build

Mac上交叉编译至Linux和Windows,Linux反之,Windows亦然,需相应调整环境变量。

  • 支持的环境列表

   go tool dist list
  aix/ppc64
  android/386
  android/amd64
  android/arm
  android/arm64
  darwin/amd64
  darwin/arm64
  dragonfly/amd64
  freebsd/386
  freebsd/amd64
  freebsd/arm
  freebsd/arm64
  freebsd/riscv64
  illumos/amd64
  ios/amd64
  ios/arm64
  js/wasm
  linux/386
  linux/amd64
  linux/arm
  linux/arm64
  linux/loong64
  linux/mips
  linux/mips64
  linux/mips64le
  linux/mipsle
  linux/ppc64
  linux/ppc64le
  linux/riscv64
  linux/s390x
  netbsd/386
  netbsd/amd64
  netbsd/arm
  netbsd/arm64
  openbsd/386
  openbsd/amd64
  openbsd/arm
  openbsd/arm64
  openbsd/mips64
  plan9/386
  plan9/amd64
  plan9/arm
  solaris/amd64
  windows/386
  windows/amd64
  windows/arm
  windows/arm64

2 编译步骤

设置MAC,LINUX,WINDOWS 编译环境和执行编译。

1.Mac Mac下编译Linux, Windows平台的64位可执行程序:

	CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build test.go

	CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build test.go

参数介绍:

  $CGO_ENABLED:0表示关闭CGO
  $GOOS:目标平台(编译后要运行的目标平台)的操作系统
    (darwin、freebsd、linux、windows)
  $GOARCH:目标平台(编译后要运行的目标平台)的体系架构
    (386、amd64、arm)分别对应(32位、64位、ARM平台)的架构

2.Linux Linux下编译Mac, Windows平台的64位可执行程序:

	CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build test.go

	CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build test.go

3.Windows Windows下编译Mac, Linux平台的64位可执行程序:

cmd:

	set GOARCH=amd64
	go env -w GOPATH=amd64
	set GOOS = linux
	go env -w GOOS=linux

还原:

	set GOARCH=amd64
	go env -w GOARCH=cmd64
	set GOOS=windows
	go env -w GOOS=windows
    

3 带cgo交叉编译步骤

设置环境信息

   export CFLAGS="-arch arm64 -miphoneos-version-min=9.0 -isysroot "$(xcrun -sdk iphoneos --show-sdk-path) 

  CGO_ENABLED=1 GOARCH=arm64 CC="clang $CFLAGS" go build -v -x -buildmode=c-archive -o libChinaPYG_arm64.a

这会同时生成libChinaPYG_arm64.a、libChinaPYG_arm64.h两个文件,直接嵌入到C代码中正常使用。

编译 darwin/arm64 的 example 命令就是:

CC=/usr/local/go/misc/ios/clangwrap.sh GOOS=darwin GOARCH=arm64 CGO_ENABLED=1 go build

编译 darwin/arm 的 example 命令是:

CC=/usr/local/go/misc/ios/clangwrap.sh GOOS=darwin GOARCH=arm CGO_ENABLED=1 go build

linux交叉编译windows:

  CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -trimpath  -o bin/main.exe ./cmd/dend-server/main.go

  CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build  -o bin/main.exe ./cmd/dend-server/main.go

4 构建测试支持

Go 提供易于使用的支持,用于通过“ go test -coverprofile=... <pkg_target>”命令在包单元测试级别收集覆盖率配置文件。

从 Go 1.20 开始,用户现在可以为更大的集成测试收集覆盖率配置文件:更重量级、更复杂的测试,执行给定应用程序二进制文件的多次运行。

对于单元测试,收集覆盖率概况和生成报告需要两个步骤:go test -coverprofile=...运行,然后调用go tool cover {-func,-html}生成报告。

对于集成测试,需要三个步骤:构建步骤、运行步骤(可能涉及从构建步骤多次调用二进制文件),最后是报告步骤,如下所述。

构建用于覆盖率分析的二进制文件,要构建用于收集覆盖率配置文件的应用程序,请-cover在调用go build应用程序二进制目标时传递标志。

请参阅下面的示例go build -cover调用部分。然后可以使用环境变量设置运行生成的二进制文件以捕获覆盖率配置文件(请参阅下一节运行)。

  • 如何为检测选择包

在给定的“ go build -cover”调用期间,Go 命令将选择主模块中的包进行覆盖率分析;默认情况下,不会包含提供给构建的其他包(go.mod 中列出的依赖项,或作为 Go 标准库一部分的包)。

例如,这是一个玩具程序,包含一个主包、一个本地主模块包greetings和一组从模块外部导入的包,包括(除其他外)rsc.io/quote和fmt(完整程序的链接)。

	$ cat go.mod
	module mydomain.com

	go 1.20

	require rsc.io/quote v1.5.2

	require (
	    golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c // indirect
	    rsc.io/sampler v1.3.0 // indirect
	)

	$ cat myprogram.go
	package main

	import (
	    "fmt"
	    "mydomain.com/greetings"
	    "rsc.io/quote"
	)

	func main() {
	    fmt.Printf("I say %q and %q\n", quote.Hello(), greetings.Goodbye())
	}
	$ cat greetings/greetings.go
	package greetings

	func Goodbye() string {
	    return "see ya"
	}
	$ go build -cover -o myprogram.exe .
	$

如果您使用“ -cover”命令行标志构建此程序并运行它,配置文件中将恰好包含两个包:main和mydomain.com/greetings;其他依赖包将被排除在外。

想要更好地控制包含哪些包以进行覆盖的用户可以使用“ -coverpkg”标志进行构建。例子:

	$ go build -cover -o myprogramMorePkgs.exe -coverpkg=io,mydomain.com,rsc.io/quote .
	$

在上面的构建中,选择了 main 包mydomain.com以及rsc.io/quote和io包进行分析;因为 mydomain.com/greetings没有具体列出,所以它将被排除在配置文件之外,即使它位于主模块中。

5 运行覆盖检测的二进制文件

用“”构建的二进制-cover文件在执行结束时将配置文件数据文件写到通过环境变量指定的目录中GOCOVERDIR。例子:

	$ go build -cover -o myprogram.exe myprogram.go
	$ mkdir somedata
	$ GOCOVERDIR=somedata ./myprogram.exe
	I say "Hello, world." and "see ya"
	$ ls somedata
	covcounters.c6de772f99010ef5925877a7b05db4cc.2424989.1670252383678349347
	covmeta.c6de772f99010ef5925877a7b05db4cc
	$

请注意写入目录的两个文件somedata:这些(二进制)文件包含覆盖率结果。有关如何从这些数据文件生成人类可读结果的更多信息,请参阅以下有关报告的部分。

如果GOCOVERDIR未设置环境变量,覆盖检测的二进制文件仍将正确执行,但会发出警告。

6 小结

大多数程序使用内置的构建方法即可,可参考以下几点:

1 你的程序没有用到 CGO 的 Golang 程序,直接用编译器自带的跨平台特性即可全平台编译;

2 用到了 CGO 需要发布到ARM平台的Golang程序,推荐自己配置ARM交叉编译环境;

3 用到了 CGO 需要发布到Win/Linux/Mac平台的Golang程序,推荐用使用go-ui-crossbuild 。

以上就是go程序执行交叉编译的流程步骤的详细内容,更多关于go执行交叉编译的资料请关注脚本之家其它相关文章!

相关文章

  • 浅析golang如何在多线程中避免CPU指令重排

    浅析golang如何在多线程中避免CPU指令重排

    这篇文章主要为大家详细介绍了golang在多线程中避免CPU指令重排的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • Golang验证器之validator是使用详解

    Golang验证器之validator是使用详解

    Validator是一个 Golang 的第三方库,用于对数据进行校验,常用于 API 的开发中,对客户端发出的请求数据进行严格校验,防止恶意请求。本文通过示例详细讲解了Validator的使用,需要的可以参考一下
    2022-08-08
  • 详解go语言判断管道是否关闭的常见误区

    详解go语言判断管道是否关闭的常见误区

    这篇文章主要想和大家一起探讨一下在Go语言中,我们是否可以使用读取管道时的第二个返回值来判断管道是否关闭,文中的示例代码讲解详细,有兴趣的可以了解下
    2023-10-10
  • goland 清除所有的默认设置操作

    goland 清除所有的默认设置操作

    这篇文章主要介绍了goland 清除所有的默认设置操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • golang中使用匿名结构体的方法

    golang中使用匿名结构体的方法

    这篇文章主要介绍了golang中使用匿名结构体,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • Go中select多路复用的实现示例

    Go中select多路复用的实现示例

    Go的select用于多通道通信,实现多路复用,支持随机选择、超时控制及非阻塞操作,建议合理使用以避免协程泄漏和死循环,感兴趣的可以了解一下
    2025-08-08
  • Go模板后端渲染时vue单页面冲突

    Go模板后端渲染时vue单页面冲突

    go后端模版语法是通过 {{}} ,vue也是通过双花括号来渲染的,如果使用go渲染vue的html页面的时候就会报错,本文主要介绍了Go模板后端渲染时vue单页面冲突,感兴趣的可以了解一下
    2024-01-01
  • golang使用zookeeper进行CURD

    golang使用zookeeper进行CURD

    本文介绍Zookeeper的基本概念及其在Golang中的实现方法,包括连接建立、节点创建与查询、节点存在性的检查、节点删除及内容修改等,具有一定的参考价值,感兴趣的可以了解一下
    2025-11-11
  • Go语言使用模板渲染HTML页面的实现技巧

    Go语言使用模板渲染HTML页面的实现技巧

    在Web开发中,服务器端模板渲染仍然是很多场景(后台管理、邮件模板、服务端渲染页面等)的首选,Go标准库里的html/template不仅易用,而且默认防XSS,非常适合服务端渲染,本文通过实战示例讲解如何在Go中使用模板渲染HTML页面,需要的朋友可以参考下
    2025-08-08
  • Go语言学习教程之指针的示例详解

    Go语言学习教程之指针的示例详解

    这篇文章主要通过简单的练习来让大家对Go语言中的指针有所了解,文中的示例代码讲解详细,对我们学习Go语言有一定帮助,需要的可以参考一下
    2022-09-09

最新评论