XCGO:CGO的跨平台编译器

上一篇《用Go语言开发的新版NodeMediaServer》说到使用了CGO实现的内置音频实时转码器。开发中遇到一个很严重的问题:无法直接生成跨平台可执行程序了。

首选我们了解到,Go语言是可以在开发平台直接生成多个目标架构和系统的可执行程序。只需要在编译前指定GOOS和GOARCH,便可以直接生成目标文件。

但当使用了CGO,便失去了这种能力。在本机平台以外,需要设置CGO_ENABLED,并且指定CC. linux和macos还好,windows也是需要gcc工具链,这个就需要部署MinGW等很复杂的操作。

在多次尝试后,受到这个项目的启发,编写了一个更简单的xcgo docker image.

简单来讲,就是利用Ubuntu系统中内置的多个交叉编译链,aarch64-linux-gnu-gcc,mips64el-linux-gnuabi64-gcc,x86_64-w64-mingw32-gcc,和通过另一个osxcross项目编译的macos编译链,并整合Go运行环境,达到开箱即用、用完无需保留的效果。

虽然无法达到GO原生那么多的架构和系统,但常用的linux、mac、win系统,x86_64,arm64架构能生成就足够大多数环境使用了。没有龙芯环境,不然可以测试下mips64el架构是否ok,有这个环境的同学可以试试。

简单用法:

–rm 编译后不保留容器,
-v ${PWD}:/workdir 将当前目录作为工作目录
-v /Users/aliang/go:/go 用本机环境GOPATH路径作为容器/go,可以避免重复拉取
-e GOPROXY=https://goproxy.io 用go代理,避免golang.org/x的包拉不下来
-e CGO_ENABLED=1 -e GOOS=windows -e GOARCH=amd64 -e CC=x86_64-w64-mingw32-gcc 就是指定windows,x86_64架构的编译参数

原创文章,转载请注明: 转载自贝壳博客

本文链接地址: XCGO:CGO的跨平台编译器

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据