Golang的跨平台編譯程序


Golang支持交叉編譯,也就是說你在32位平台的機器上開發,可以編譯生成64位平台上的可執行程序。

交叉編譯依賴下面幾個環境變量:

$GOARCH    目標平台(編譯后的目標平台)的處理器架構(386、amd64、arm)
$GOOS          目標平台(編譯后的目標平台)的操作系統(darwin、freebsd、linux、windows)


各平台的GOOS和GOARCH參考 

OS                   ARCH                          OS version

linux                386 / amd64 / arm             >= Linux 2.6

darwin               386 / amd64                   OS X (Snow Leopard + Lion)

freebsd              386 / amd64                   >= FreeBSD 7

windows              386 / amd64                   >= Windows 2000


跨平台編譯步驟:

一、了解目標平台架構:

下面幾個命令有助於了解目標平台的架構:

[root@localhost ~]# uname -a
Linux localhost.localdomain 2.6.32-279.19.1.el6.x86_64 #1 SMP Wed Dec 19 07:05:20 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost ~]# uname -m
x86_64
[root@localhost ~]# arch
x86_64
[root@localhost ~]# file /bin/cat
/bin/cat: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
[root@localhost ~]#

這里可以看到這個服務器的架構是 x86_64 這個架構亦稱 amd64.

  • 6g是amd64的go編譯器,它生成的是.6文件。
  • 386一般使用8g命令,它生成的一般是.8格式的文件。
  • 當然還有一個5g的命令是用於arm的cpu,

同理amd64用6l,386用8l,arm用5l的鏈接器

參考資料:

Linux下如何查看系統是32位還是64位的?
http://blog.csdn.net/whucs_b701/article/details/8543499

 

 

二、准備目標平台需要的包和工具文件

執行下面命令:

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

這里 額外多一個環境變量 CGO_ENABLED 是因為 交叉編譯不支持 CGO,我們這里禁用它。

這里並不是重新編譯Go,因為安裝Go的時候,只是編譯了本地系統需要的東西;而需要跨平台交叉編譯,需要在Go中增加對其他平台的支持。所以,有 ./make.bash 這么一個過程。

執行結果類似如下:

sudo CGO_ENABLED=0 GOOS=linux GOARCH=amd64 ./make.bash
Password:
# Building C bootstrap tool.
cmd/dist

# Building compilers and Go bootstrap tool for host, darwin/amd64.
lib9
libbio
libmach
misc/pprof
cmd/addr2line
cmd/cov
cmd/nm
cmd/objdump
cmd/pack
cmd/prof
cmd/cc
…...
pkg/text/template/parse
pkg/text/template
pkg/go/doc
pkg/go/build
cmd/go
pkg/runtime (linux/amd64)

# Building packages and commands for host, darwin/amd64.
runtime
errors
sync/atomic
unicode
unicode/utf8
math
sync
unicode/utf16
crypto/subtle
io
syscall
……….
net/rpc/jsonrpc
testing/iotest
testing/quick

# Building packages and commands for linux/amd64.
runtime
errors
sync/atomic
unicode
unicode/utf8
math
sync
unicode/utf16
……..
testing
net/rpc/jsonrpc
testing/iotest
testing/quick


---
Installed Go for linux/amd64 in /usr/local/go
Installed commands in /usr/local/go/bin

安裝完成后,我們可以看到 Go的安裝目錄下 多了這個平台特有的幾個命令行工具。

NewImage

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

三、編譯對應平台下的執行文件

到源代碼目錄下執行:

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build

不帶前面參數的 go build 只是編譯出開發環境適用的執行文件。

 

 

 

 

參考資料:

Cross compile Go on OSX?
http://stackoverflow.com/questions/12168873/cross-compile-go-on-osx

跨平台編譯Go程序
http://bbs.studygolang.com/thread-65-1-1.html
http://solovyov.net/en/2012/cross-compiling-go/
http://studygolang.com/topics/21
 

An introduction to cross compilation with Go
http://dave.cheney.net/2012/09/08/an-introduction-to-cross-compilation-with-go


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM