尝试使用Go语言进行交叉编译

因为可以进行交叉编译,所以作为Golang的入门,尝试在Linux上创建Windows的可执行文件是非常具有吸引力的。

成果

    • 割りと簡単にクロスコンパイルはできた。(コードレベルでの依存性とか互換は除く)

 

    • C言語だとMinGW-w64でクロスコンパイル環境作るのが大変なのに対して、こちらは非常に楽。

 

    • 実行ファイルサイズがちょっと大きい(約2MB)のは色々静的リンクしてあるかららしい。

 

    • 最適化オプション( -gcflags ‘-N -l’ )を付けても変わらず。

 

    クロスコンパイルのコストと秤にかけるとそれぐらいいいかなという気がする。

常见问题- golang.jp
http://golang.jp/go_faq#为什么我的简单程序会是一个如此庞大的二进制文件

gc工具链的链接器(5l、6l、8l)执行静态链接。因此,所有的Go二进制文件都包含了Go运行时,其中包含了在动态类型检查、反射以及崩溃时的堆栈跟踪时所需的运行时类型信息。

使用gcc在Linux上编译并执行静态链接,C语言的简单的“hello, world”程序大约为750 kB,其中包含了printf函数的实现。而使用fmt.Printf的相似的Go语言程序大小约为1.2 MB,其中包含了强大的运行时支持。

安装

# yum install golang
# yum install golang-pkg-windows-amd64
# go version
go version go1.4.2 linux/amd64

创建、执行和编译源代码

$ cat hello.go
package main

import "fmt"

func main() {
  fmt.Printf("hello world\n")
}
$ go run hello.go
hello world
$ go build hello.go
$ ./hello
hello world
$ GOOS=windows GOARCH=amd64 go build hello.go
$ ll -h
合計 3.9M
-rwxr-xr-x 1 ymko users 1.9M  7月 30 02:16 hello
-rwxr-xr-x 1 ymko users 2.0M  7月 30 02:17 hello.exe
-rw-r--r-- 1 ymko users   73  7月 30 02:15 hello.go

在Windows上运行

C:\tmp> hello.exe
hello world

请参考

首次使用 Go 语言(在 Windows 上)- Qiita
在构建 Golang 时禁用优化 – tetsuok 的旅行博客

广告
将在 10 秒后关闭
bannerAds