我正在尝试在Linux上设置Go编译器,该编译器可以为任何其他体系结构或平台编译项目。我正在使用来自官方Ubuntu 14.04存储库的默认软件包,并且正在使用64位系统。这种配置允许我仅针对Linux和64位系统进行编译。至少我想为32位Linux甚至32位Windows系统进行编译。有可能以某种方式做吗?
另一件事是我想使用两个Go绑定:
https://github.com/mattn/go-gtk和https://github.com/mattn/go-webkit
我正在使用go-webkit示例代码进行测试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | package main import ( "os" "github.com/mattn/go-gtk/gtk" "github.com/mattn/go-webkit/webkit" ) const HTML_STRING = ` <doctype html> <meta charset="utf-8"/> <style> div { font-size: 5em } </style> <script src="http://code.jquery.com/jquery-latest.js"> $(function() { $('#hello1').slideDown('slow', function() { $('#hello2').fadeIn() }) }) Hello 世界 ` const MAP_EMBED = ` <style> *{ margin : 0; padding : 0; } </style> <iframe width="100%" height="100%" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.co.jp/maps?f=q&source=s_q&hl=en&geocode=&q=osaka&aq=&sll=34.885931,-115.180664&sspn=29.912003,39.506836&brcurrent=3,0x6000e86b2acc70d7:0xa399ff48811f596d,0&ie=UTF8&hq=&hnear=%E5%A4%A7%E9%98%AA%E5%BA%9C%E5%A4%A7%E9%98%AA%E5%B8%82&ll=34.693738,135.502165&spn=0.471406,0.617294&z=11&output=embed"></iframe> ` func main() { gtk.Init(nil) window := gtk.NewWindow(gtk.WINDOW_TOPLEVEL) window.SetTitle("webkit") window.Connect("destroy", gtk.MainQuit) vbox := gtk.NewVBox(false, 1) entry := gtk.NewEntry() entry.SetText("http://golang.org/") vbox.PackStart(entry, false, false, 0) swin := gtk.NewScrolledWindow(nil, nil) swin.SetPolicy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) swin.SetShadowType(gtk.SHADOW_IN) webview := webkit.NewWebView() webview.Connect("load-committed", func() { entry.SetText(webview.GetUri()) }) swin.Add(webview) vbox.Add(swin) entry.Connect("activate", func() { webview.LoadUri(entry.GetText()) }) button := gtk.NewButtonWithLabel("load String") button.Clicked(func() { webview.LoadString("hello Go GTK!","text/plain","utf-8",".") }) vbox.PackStart(button, false, false, 0) button = gtk.NewButtonWithLabel("load HTML String") button.Clicked(func() { webview.LoadHtmlString(HTML_STRING,".") }) vbox.PackStart(button, false, false, 0) button = gtk.NewButtonWithLabel("Google Maps") button.Clicked(func() { webview.LoadHtmlString(MAP_EMBED,".") }) vbox.PackStart(button, false, false, 0) window.Add(vbox) window.SetSizeRequest(600, 600) window.ShowAll() proxy := os.Getenv("HTTP_PROXY") if len(proxy) > 0 { soup_uri := webkit.SoupUri(proxy) webkit.GetDefaultSession().Set("proxy-uri", soup_uri) soup_uri.Free() } entry.Emit("activate") gtk.Main() } |
如果我用它编译就可以了
1 | go build |
如果我尝试使用其他设置进行编译:
1 2 | GOOS=windows GOARCH=386 go build GOARCH=386 go build |
我收到此错误:
webview.go:5:2: no buildable Go source files in
/home/yeeapple/Documents/Coding/Go/Source/src/github.com/mattn/go-gtk/gtkwebview.go:6:2: no buildable Go source files in
/home/yeeapple/Documents/Coding/Go/Source/src/github.com/mattn/go-webkit/webkit
我看到的另一件事是,在GOPATH目录和pkg文件夹中,只有带有* .a文件的" linux_amd64"文件夹。
例如,如果没有其他导入,则可以为其他系统编译Go文件。跨平台编译可以在以下情况下正常工作:
1 2 3 4 5 6 7 8 | package main import"fmt" func main() { fmt.Printf("hello, world\ ") } |
版本:
1 2 3 4 5 6 | $ go version go version go1.2.1 linux/amd64 $ gccgo --version gccgo (Ubuntu 4.9-20140406-0ubuntu1) 4.9.0 20140405 (experimental) [trunk revision 209157] Copyright (C) 2014 Free Software Foundation, Inc. |
- 这不是答案,但是您可能想要尝试类似GoXC(github.com/laher/goxc)的东西。 如果您是该语言的新手,那么它很简单。
- 我已经设法跨平台编译迈出了一步。 我已经下载了Go 1.3,并在src文件夹中运行了make.bash来制作引导程序。 当我尝试为Windows 32位编译时,收到此消息(CGO_ENABLED = 1):#runtime / cgo gcc:错误:无法识别的命令行选项" -mthreads"
在Go 1.2中,交叉编译代码时禁用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | package main /* #include <stdlib.h> #include <stdio.h> */ import"C" import"unsafe" func main() { hello := C.CString("Hello world") defer C.free(unsafe.Pointer(hello)) C.puts(hello) } |
在amd64 Linux系统上,如果尝试针对x86进行编译,则会出现构建失败:
1 2 | $ GOARCH=386 go build hello.go can't load package: no buildable Go source files in /... |
要编译此程序,您还需要将环境变量
1 | $ sudo apt-get install gcc-multilib |
安装该程序后,您应该能够编译该程序:
1 2 3 | $ GOARCH=386 CGO_ENABLED=1 go build hello.go $ file hello hello: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=..., not stripped |
尽管Ubuntu带有Windows交叉编译工具链(在
1 2 | $ GOOS=windows GOARCH=386 CGO_ENABLED=1 go build hello.go go build runtime/cgo: cannot use cgo when compiling for a different operating system |
此检查在GO 1.3中不再存在,因此您可能对该版本有些幸运。
现在,可以使用交叉编译器工具链只是其中的一部分:您还将需要为可用的目标体系结构编译依赖项的版本。对于像WebKit这样的大对象来说,这并不是一件容易的事,但是您可以使用
- 谢谢。 这对我有很大帮助,但是并不能解决跨平台编译的奥秘。 我认为Go语言(v1.3)目前还没有完整的跨平台编译支持。
- 我发现go-gtk和go-webkit库存在一些问题,在Go 1.3下它不起作用。 我接受这个答案。