跨平台编译Go程序(交叉编译)

polaris · 2013-03-22 02:12:52 · 40417 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2013-03-22 02:12:52 的主题,其中的信息可能已经有所发展或是发生改变。

(1)首先进入go/src 源码所在目录,执行如下命令创建目标平台所需的包和工具文件。

$ cd /usr/local/go/src
$ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 ./make.bash

如果是 Windows 则修改 GOOS 即可。
$ CGO_ENABLED=0 GOOS=windows GOARCH=amd64 ./make.bash

(2) 现在可以编译 Linux 和 Windows 平台所需的执行文件了。

$ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
$ CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build

不过该方式暂时不支持 CGO。

http://solovyov.net/en/2012/03/09/cross-compiling-go/

以上假定是64位架构,32位,修改GOARCH为386

说明:
这里并不是重新编译Go,因为安装Go的时候,只是编译了本地系统需要的东西;而需要跨平台交叉编译,需要在Go中增加对其他平台的支持。所以,有 ./make.bash 这么一个过程

交叉编译问题补充:

首先,建议安装Go语言通过源码安装,否则可能没有make.bash或make.bat程序。

之所以需要执行上面的这些步骤,是因为安装Go语言时,一些工具和平台相关的代码并没有生成,执行上面的步骤,并不是重新安装Go语言,而是生成交叉编译(目标平台)需要的工具和文件。这些只是在第一次交叉编译的时候做。之后就不需要了。

为了更快的编译,可以

./make.bash --no-clean

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

40417 次点击  ∙  1 赞  
加入收藏 微博
13 回复  |  直到 2015-04-18 00:37:23
cnjack
cnjack · #1 · 12年之前

哈哈,今天正准备找找方法了。。

cnjack
cnjack · #2 · 12年之前

CGO_ENABLED=0 GOARCH=arm GOOS=linux ./make.bash 哈哈,是支持安卓的~~~~`

gs272
gs272 · #3 · 12年之前

交叉编译干什么用啊?编译出来的可以跨平台运行? 是不是针对于操作系统编译器编译出的的可执行文件中除了必要的二进制编码外,还有些操作系统添加进去的东西啊,使程序不能跨平台执行? 那开发操作系统需要的纯粹的编译器怎么做?靠自己写?

jimmykuu
jimmykuu · #4 · 12年之前

比如你手头只有Mac系统,而你的用户有Linux和Windows的,他们也想用,你可以通过交叉编译出Linux和Windows上的可执行文件给他们用

6b79
6b79 · #5 · 12年之前

请问一下,按上面的方法以后。每次 go 都要指定那一串平台参数,有没有办法默认就是本地的平台。

polaris
polaris · #6 · 12年之前
6b796b79 #5 回复

请问一下,按上面的方法以后。每次 go 都要指定那一串平台参数,有没有办法默认就是本地的平台。

本地平台不是交叉编译,为什么要指定这一堆呢?直接编译就好了

6b79
6b79 · #7 · 12年之前

我用的是Mac,通过gvm来管理go版本。我需要编译一个应用放到linux32位系统上面。

cd ~/.gvm/gos/go1.1.2/src  
CGO_ENABLED=0 GOOS=linux GOARCH=386 ./make.bash

这样以后,"CGO_ENABLED=0 GOOS=linux GOARCH=386 go install"编译linux32的应用没有问题了。但是如果不带参数 CGO ... GOOS ... GOARCH 编译本地平台应用就要报错。

# runtime/cgo  
clang: warning: argument unused during compilation: '-pthread'  
# runtime/cgo  
clang: error: no such file or directory: 'libgcc.a'
6b79
6b79 · #8 · 12年之前

我用的是Mac,通过gvm来管理go版本。我需要编译一个应用放到linux32位系统上面。

cd ~/.gvm/gos/go1.1.2/src  
CGO_ENABLED=0 GOOS=linux GOARCH=386 ./make.bash

这样以后,"CGO_ENABLED=0 GOOS=linux GOARCH=386 go install"编译linux32的应用没有问题了。但是如果不带参数 CGO ... GOOS ... GOARCH 的执行 "go install" 编译本地平台应用就要报错。

# runtime/cgo  
clang: warning: argument unused during compilation: '-pthread'  
# runtime/cgo
clang: error: no such file or directory: 'libgcc.a'
6b79
6b79 · #9 · 12年之前

好像是和OS X的本地编辑器有关。我重新指定了 CC=llvm-gcc 就OK了。

baiyuxiong
baiyuxiong · #10 · 10年之前

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 ./make.bash 这句里 make.bash 是干啥的? 提示 -bash: ./make.bash: No such file or directory 是什么原因?

baiyuxiong
baiyuxiong · #11 · 10年之前
baiyuxiongbaiyuxiong #10 回复

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 ./make.bash 这句里 make.bash 是干啥的? 提示 -bash: ./make.bash: No such file or directory 是什么原因?

明白了,要到GOROO/src目录下执行,不是GOPATH

qkb_75_go
qkb_75_go · #12 · 10年之前

还是 GOX 好用呀!重新 make 一个golang 可不是好耍的。

qkb_75_go
qkb_75_go · #13 · 10年之前
qkb_75_goqkb_75_go #12 回复

还是 GOX 好用呀!重新 make 一个golang 可不是好耍的。

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传