當前位置:首頁 » 編程軟體 » golang交叉編譯

golang交叉編譯

發布時間: 2022-01-14 01:30:53

A. Golang 讀文件為什麼這么慢

mac下編譯器默認編譯的是mac os x的可執行文件。 編譯centos上的可執行文件的時候需要交叉編譯。 golang的交叉編譯很容易,你的情況的話用下面這條命令 GOOS=linux GOARCH=amd64 go build ./文件

B. Go語言怎麼交叉編譯別的機器或系統的可執行文件

windows下面用以下代碼,最好放一個bat文件里.[mw_shl_code=applescript,true]set GOROOT=c:\mygoset GOOS=windowsset GOARCH=386set GOPATH=c:\mygopathset PATH=%PATH%;c:\mingw\bin;%GOROOT%\bincd %GOPATH%\src[/mw_shl_code]

C. 使用Go 語言開發大型 MMORPG 游戲伺服器怎麼樣

從2013年起,經朋友推薦開始用Golang編寫游戲登陸伺服器, 配合C++做第三方平台驗證. 到編寫獨立工具導表工具GitHub - davyxu/tabtoy: 跨平台的高性能便捷電子表格導出器. 以及網路庫GitHub - davyxu/cellnet: 簡單,方便,高效的Go語言的游戲伺服器底層. 最終使用這些工具及庫編寫整個游戲伺服器框架, 我的感受是很不錯的
細節看來, 有如下的幾個點:
語言, 庫
Golang語言特性和C很像, 簡單, 一張A4紙就能寫完所有特性. 你想想看, C++到了領悟階段, 也只用那幾個簡單特性, 剩下的都是一大堆解決各種內存問題的技巧. 而Golang一開始就簡單, 何必浪費生命去研究那一大堆的奇技淫巧呢?
Golang的坑只有2個:1. interface{}和nil配合使用, 2. for循環時, 將循環變數引入閉包(Golang, Lua, C#閉包變數捕獲差異) 完全不影響正常使用, 復合語言概念, 只是看官方後面怎麼有效的避免
用Golang就忘記繼承那套東西, 用組合+介面
用Golang伺服器如何保證解決游戲伺服器存檔一致性問題? stop the world是肯定的, 但是Golang可以從語言層並發序列化玩家數據, 再通過後台存檔
channel是goroutine雖然是Golang的語言特性. 但是在編寫伺服器時, 其實只有底層用的比較多.
Golang的第三方庫簡直多如牛毛, 好的也很多
不要說模板了, C#的也不好用, 官方在糾結也不要加, 使用中, 沒模板確實有點不方便. 用interface{}/反射做泛型對於Golang這種強類型語言來說,還是有點打臉

運行期
Golang和C++比性能的話, 這是C++的優勢, Golang因為沒虛擬機, 只有薄薄的一層調度層. 因此性能是非常高的, 用一點性能犧牲換開發效率, 妥妥的
1.6版後的GC優化的已經很好了, 如果你不是高性能,高並發Web應用, 非要找出一堆的優化技巧的話. 只用Golang寫點游戲伺服器, 那點GC損耗可以忽略不計
和其他現代語言一樣, 崩潰捕捉是標配功能, 我用Golang的伺服器線上跑, 基本沒碰到過崩潰情況
熱更新: 官方已經有plugin系統的提交, 跨平台的. 估計很快就可以告別手動cgo做so熱更新
開發, 調試, 部署, 優化
LiteIDE是我首選的Golang的IDE, 雖然有童鞋說B格不高. 但這估計實在是找不到缺點說了, 別跟我說Visual Studio, 那是宇宙級的...
曾經聽說有人不看好Golang, 我問為啥: 說這么新的語言, 不好招人,後面打聽到他是個策劃... 好吧
真實情況是這樣的: Golang對於有點編程基礎的新人來說, 1周左右可以開始貢獻代碼. 老司機2~3天.
開發效率還是不錯的, 一般大的游戲功能, 2*2人一周3~4個整完. 這換C++時代, 大概也就1~2個還寫不完. 對接伺服器sdk的話, 大概1天接個10多個沒問題
Golang自帶性能調優工具, 從內存, CPU, 阻塞點等幾個方面直接出圖進行分析, 非常直觀, 可以參考我博客幾年前的分析: 使用Golang進行性能分析(Profiling)
Golang支持交叉編譯, 跨平台部署, 什麼概念? linux是吧? 不問你什麼版本, 直接windows上編譯輸出一個elf, 甩到伺服器上開跑.不超過1分鍾時間..

D. Go語言的支持平台

LiteIDE是一款專門為Go語言開發的跨平台輕量級集成開發環境(IDE),由QT編寫。
LiteIDE主要特點: 支持主流操作系統
Windows
Linux
MacOS X Go編譯環境管理和切換
管理和切換多個Go編譯環境
支持Go語言交叉編譯 與Go標准一致的項目管理方式
基於GOPATH的包瀏覽器
基於GOPATH的編譯系統
基於GOPATH的Api文檔檢索 Go語言的編輯支持
類瀏覽器和大綱顯示
Gocode(代碼自動完成工具)的完美支持
Go語言文檔查看和Api快速檢索
代碼表達式信息顯示F1
源代碼定義跳轉支持F2
Gdb斷點和調試支持
gofmt自動格式化支持 其他特徵
支持多國語言界面顯示
完全插件體系結構
支持編輯器配色方案
基於Kate的語法顯示支持
基於全文的單詞自動完成
支持鍵盤快捷鍵綁定方案
Markdown文檔編輯支持
實時預覽和同步顯示
自定義CSS顯示
可導出HTML和PDF文檔
批量轉換/合並為HTML/PDF文檔 Sublime Text 2(以下簡稱Sublime)+ GoSublime + gocode + MarGo的組合。
其優點有: 自動化提示代碼。 保存的時候自動格式化代碼,讓您編寫的代碼更加美觀,符合Go的標准。 支持項目管理 支持語法高亮 熟悉Java的讀者應該對於idea不陌生,idea是通過一個插件來支持go語言的高亮語法,代碼提示和重構實現。

E. golang保存二進制文件會有大小端問題嗎

golang保存二進制文件會有大小端問題。

這個二進制文件的確有Big Endian 和Little Endian的問題,這個與CPU指令體系有關,不過不用操心,像JPEG就是Big Endian,其編解碼就都是按照這個約定來完成的,沒有平台問題,也沒有大小端的問題。

編譯centos上的可執行文件的時候需要交叉編譯。golang的交叉編譯很容易,你的情況的話用下面這條命令,GOOS=linux GOARCH=amd64 go build ./文件。

golang描述:

Go的語法接近C語言,但對於變數的聲明有所不同。Go支持垃圾回收功能。Go的並行模型是以東尼·霍爾的通信順序進程(CSP)為基礎。

採取類似模型的其他語言包括Occam和Limbo,但它也具有Pi運算的特徵,比如通道傳輸。在1.8版本中開放插件(Plugin)的支持,這意味著現在能從Go中動態載入部分函數。

與C++相比,Go並不包括如枚舉、異常處理、繼承、泛型、斷言、虛函數等功能,但增加了 切片(Slice) 型、並發、管道、垃圾回收、介面(Interface)等特性的語言級支持。Go 2.0版本將支持泛型,對於斷言的存在,則持負面態度,同時也為自己不提供類型繼承來辯護。

F. 編譯好的golang 伺服器 需要 安裝 go 嗎

不用,但是編譯的系統環境,要和運行的系統環境一樣(比如都是Linux64位的),當然也可以交叉編譯(在Windows上就可以編譯出Linux能用的可執行文件)

G. golang 在mac 下go install成二進制文件,上傳到centos 無法執行

mac下編譯器默認編譯的是mac os x的可執行文件。
編譯centos上的可執行文件的時候需要交叉編譯。
golang的交叉編譯很容易,你的情況的話用下面這條命令
GOOS=linux GOARCH=amd64 go build ./文件

H. golang cgo 怎麼傳字元串

第一步:all.bash

% cd $GOROOT/src
% ./all.bash

第一步有些突兀,因為 all.bash 僅僅調用了其它兩個 shell 腳本;make.bash 和 run.bash。如果你在使用 Windows 或 Plan 9,過程是一樣的,只是腳本擴展名變成了.bat 或.rc。對於本文中的其它腳本,請根據你的系統適當改動。
第二步:make.bash

. ./make.bash --no-banner

main.bash 來源於 all.bash,因此調用退出將正確終止便宜進程。main.bash 有三個主要工作,第一個是驗證編譯 Go 的環境是否完整。完整性檢查在過去幾年中建立,它通常嘗試避免使用已知的破損工具或必然失敗的環境進行編譯。
第三步. cmd/dist

gcc -O2 -Wall -Werror -ggdb -o cmd/dist/dist -Icmd/dist cmd/dist/*.c

一旦可用性檢查完畢,make.bash 將編譯產生 cmd/dist,cmd/dist取代了之前存在於Go 1 之前的Makefile 編譯系統。cmd/dist用來管理少量的pkg/runtime的代碼生成。cmd/dist 是C語言編寫的程序,能夠充分利用系統C編譯器和頭文件來處理大部分主機系統平台的檢測。cmd/dist通常用來檢測主機的操作系統和體系結構,即環境變數$GOHOSTOS和$GOHOSTARCH .如果是交叉編譯的話,變數 $GOOS和$GOARCH可能會由於你的設置而不同。事實上,Go 通常用作跨平台編譯器,只不過多數情況下,主機和目標系統一致而已。接下來,make.bash 調用cmd/dist 的引導參數的支持庫、 lib9、 libbio 和 libmach,使用編譯器套件,然後用自己的編譯器進行編譯。這些工具也是用 C 語言寫的中,但是由系統 C 編譯器編譯產生。

echo "# Building compilers and Go bootstrap tool for host, $GOHOSTOS/$GOHOSTARCH."
buildall="-a"
if [ "$1" = "--no-clean" ]; then
buildall=""
fi
./cmd/dist/dist bootstrap $buildall -v # builds go_bootstrap

使用的編譯器套件 cmd/dist 編譯產生一個版本的gotool,go_bootstrap。但go_bootstrap並不是完整得gotool,比方說 pkg/net 就是孤立的,避免了依賴於 cgo。要編譯的文件的列表以及它們的依賴項,是由cmd/dist編譯的 ,所以十分謹慎地避免引入新的生成依賴項 到 cmd/go。

第四步:go_bootstrap

現在, go_bootstrap 編譯完成了,make.bash 的最後一部就是使用 go_bootstrap 完成 Go 標准庫的編譯,包括整套 gotool 的替換版。

echo "# Building packages and commands for $GOOS/$GOARCH."
"$GOTOOLDIR"/go_bootstrap install -gcflags "$GO_GCFLAGS" \
-ldflags "$GO_LDFLAGS" -v std

第五步:run.bash

現在,make.bash 完成了,運行回到了 all.bash,它將引用 run.bash。run.bash 的工作是編譯和測試標准庫,運行時以及語言測試套件。

I. go語言哪個包簡單一點,可以看源碼

LiteIDE是一款專門為Go語言開發的跨平台輕量級集成開發環境(IDE),由QT編寫。LiteIDE主要特點:支持主流操作系統WindowsLinuxMacOSXGo編譯環境管理和切換管理和切換多個Go編譯環境支持Go語言交叉編譯與Go標准一致的項目管理方式基於GOPAT

J. linux下怎麼安裝Go開發環境

一、Go安裝使用

1、下載Go源碼包
https://storage.googleapis.com/golang/go1.6.3.linux-amd64.tar.gz

上傳到/usr/local/src目錄下

2、編譯安裝Go到/usr/local
tar zxvf go1.6.3.linux-amd64.tar.gz -C /usr/local/

#註:必須使用root賬戶或者使用sudo來解壓縮Go源碼包

3、設置PATH環境變數,添加/usr/local/go/bin到環境變數
export PATH=$PATH:/usr/local/go/bin

4、安裝到自定義位置

Go二進制文件默認安裝到/usr/local/go,但是可以安裝Go工具到不同的位置,可以自行定義,只需要設置正確的環境變數。

例如,安裝Go到家目錄下,必須添加環境變數到$HOME/.profile
export GOROOT=$HOME/go

export PATH=$PATH:$GOROOT/bin

註:安裝Go到其他目錄時,GOROOT必須設置為環境變數

5、檢查是否正確安裝程序

通過設置一個工作區和建立一個簡單的程序,檢查是否正確安裝了一個簡單的程序。創建一個目錄包含您的工作空間,例如/data/work,並設置GOPATH環境變數指向的位置。
export GOPATH=/data/work

#如果不存在/data/work,需要新建

然後,在你的工作內創建src/github.com/user/hello,如果使用github,可以使用自己的用戶名代替user,在hello目錄下,新建hello.go
# cat hello.go
package main
import "fmt"
func main {
fmt.Printf("hello,world!\n")
}

#使用go編譯hello.go
go install github.com/user/hello

#上面的命令講名叫hello(or hello.exe)的程序放到你的工作區內,執行下面命令,會得到輸出結果。
$GOPATH/bin/hello

hello,world!

#當出現hello,world!表明Go已經安裝成功可以工作。

二、Go工作區介紹

1、機構組織代碼概述

Go語言程序通常將所有的代碼保存在一個工作區中。

工作區包含許多版本控制庫(由Git管理)。

每個存儲庫包含一個或多個包。

每個包由一個或多個在一個目錄中的源文件組成。

一個包的目錄的路徑決定其導入路徑。

註:同於其他的編程環境中,每一個項目都有一個獨立的工作區且工作區是緊密聯系在一起的版本控制庫。

2、工作區介紹

工作區是一個目錄層次結構,它的根目錄有三個目錄:

src 包含Go源文件

pkg 包含對象和包

bin 包含可執行命令
Go工具創建源碼包並安裝二進制文件到pkg和bin目錄下
src目錄通常包含多個版本控制庫(如Git或Mercurial),跟蹤一個或多個源包的開發。
下面展示一個好的工作區的例子:
bin/
hello # command executable
outyet # command executable
pkg/
linux_amd64/
github.com/golang/example/
stringutil.a # package object
src/
github.com/golang/example/
.git/ # Git repository metadata
hello/
hello.go # command source
outyet/
main.go # command source
main_test.go # test source
stringutil/
reverse.go # package source
reverse_test.go # test source
golang.org/x/image/
.git/ # Git repository metadata
bmp/
reader.go # package source
writer.go # package source
... (many more repositories and packages omitted) ...

上面的屬性圖展示了一個包含兩個存儲庫(example和image)的工作區,example 存儲庫包含兩個命令(hello,outyet),image庫包含bmp包和幾個其他的包。

一個典型的工作區包含包含許多軟體包和命令的多個源庫。大多數程序員將所有的源代碼和依賴關系保存在一個工作區中

3、GOPATH環境變數設置

GOPATH環境變數指定工作區的位置。它很可能是唯一的環境變數,代碼開發時需要設置。

開始,創建一個工作區目錄並設置相應的gopath。您的工作區可以位於任何你喜歡的地方,但我們將在這個文檔中使用/data/work。請注意,這不能是您的「Go安裝」路徑相同。
mkdir -p /data/work

export GOPATH=/data/work

為了方便。添加工作區的bin到PATH中
export PATH=$PATH:$GOPATH/bin

4、導入路徑

一個導入路徑是唯一標識一個包的字元串。一個包的導入路徑對應於它在工作區內或遠程存儲庫中的位置。

從標准庫的軟體包中給出了短的導入路徑等。對於您自己的包,您必須選擇不可能和未來添加到標准庫或其他外部庫的基礎路徑沖突的路徑。

注意,你不需要將你的代碼發布到一個遠程存儲庫之前,你可以建立它。這只是一個很好的習慣來組織你的代碼,如果你有一天會出版它。在實踐中,你可以選擇任何任意的路徑名稱,只要它是唯一的標准庫和更大的去生態系統。

我們將使用github.com/user作為我們的基本路徑。在您的工作區中創建一個目錄,以保持源代碼:
mkdir -p $GOPATH/src/github.com/user

5、第一個項目

編譯並運行一個簡單的程序,首先選擇一個包的路徑(我們將使用github.com/user/hello)和創建在您的工作區相應的軟體包目錄:
mkdir $GOPATH/src/github.com/user/hello

創建名叫hello.go的文件,上面創建過,此處略過。
cd $GOPATH/src/github.com/user/hello
go install
$GOPATH/bin/hello

或者:
hello

如果你使用的是一個源代碼管理系統,現在是一個很好的時間來初始化一個存儲庫,添加文件,並提交你的第一次更改。再次,這一步是可選的:您不需要使用源代碼管理來寫代碼。
cd $GOPATH/src/github.com/user/hello

git init

Initialized empty Git repository in /data/work/src/github.com/user/hello/.git/

git add hello.go

git commit -m "first commit"

[master (root-commit) bbfb477] first commit

6、first library

mkdir $GOPATH/src/github.com/user/stringutil

下一步,在目錄下創建一個名為reverse.go文件中有下列內容:
// Package stringutil contains utility functions for working with strings.

package stringutil

// Reverse returns its argument string reversed rune-wise left to right.

func Reverse(s string) string {

r := []rune(s)

for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 {

r[i], r[j] = r[j], r[i]

}

return string(r)

}

使用go build測試包的編譯
$ go build github.com/user/stringutil

如果當前位置源碼包目錄,只需要:
go build

上面操作並不會產生一個輸出文件,必須使用go install,把包和對象輸出到工作去的pkg目錄內

確認stringutil包創建完成後,修改原始hello.go,使用stringutil包:
package main

import (

"fmt"

"github.com/user/stringutil"

)

func main() {

fmt.Printf(stringutil.Reverse("\n !oG ,olleH"))

}

無論使用go安裝包還是二進制文件,所有相關的依賴都會自動安裝。所以當你安裝hello程序時:
$ go install github.com/user/hello

對應的stringutil包會自動安裝好。

執行新的hello程序,可以看到消息已經被反轉
# hello

Hello, Go!

完成上面操作之後,工作區應該為:
├── bin

│ └── hello # command executable

├── pkg

│ └── linux_amd64 # this will reflect your OS and architecture

│ └── github.com

│ └── user

│ └── stringutil.a # package object

└── src

└── github.com

└── user

├── hello

│ └── hello.go # command source

└── stringutil

└── reverse.go # package source

注意:go install會把庫文件stringutil.a放到pkg/linux_amd64下邊(目錄結構跟源代碼結構一樣)。這樣可以go命令可以直接找到對應的包對象,避免不必要的重復編譯。linux_amd64是為了根據操作系統和你的系統架構交叉編譯。

所有Go可執行程序都通過靜態方式鏈接在一起,所以在運行時是不需要相關的包對象(庫)。

7、包命令

所有的Go源代碼都以下面的語句開始:
package name

其中name就是包引用默認的名稱,一個包中的所有文件必須使用同一個包名,可執行命令必須是main。

一個二進制文件下所有的包名不需要唯一,但是引用路徑必須唯一

8、測試

Go自帶了一個輕量級的測試框架,由go test和testing包組成。

可以通過新建xx_test.go寫一個測試,其中包含若干個TestXXX函數。測試框架會自動執行這些函數;如果函數中包含tError或t.Fail, 對應的測試會被判為失敗。

添加一個針對stringutil的測試文件$GOPATH/src/github.com/user/stringutil/reverse_test.go,包含以下內容:
package stringutil

import "testing"

func TestReverse(t *testing.T) {

cases := []struct {

in, want string

}{

{"Hello, world", "dlrow ,olleH"},

{"Hello, 世界", "界世,olleH"},

{"", ""},

}

for _, c := range cases {

got := Reverse(c.in)

if got != c.want {

t.Errorf("Reverse(%q) == %q, want %q", c.in, got, c.want)

}

}

}

#通過go test測試
# go test github.com/user/stringutil

ok github.com/user/stringutil 0.002s

#同樣的,在包文件夾下可以忽略路徑而直接執行go test
[root@zabbix stringutil]# go test

PASS

ok github.com/user/stringutil 0.002s

9、遠程包

包的引用路徑用來描述如何通過版本控制系統獲取包的源代碼。go工具通過引用路徑自動從遠程代碼倉庫獲取包文件。比如本文中用的例子也對應的保存在github.com/golang/example下。go可以通過包的代碼倉庫的url直接獲取、生成、安裝對應的包。
[root@zabbix ~]# go get github.com/golang/example/hello

[root@zabbix ~]# $GOPATH/bin/hello

Hello, Go examples!

如果工作區中不存在對應的包,go會將對應的包放到GOPATH環境變數指明的工作區下。(如果包已經存在,go跳過代碼拉去而直接執行go install)
建議詳細看一下http://www.linuxprobe.com/set-go-env.html這個,有圖文

熱點內容
安卓711怎麼root 發布:2024-11-13 13:31:09 瀏覽:496
植物2文件夾 發布:2024-11-13 13:26:51 瀏覽:59
androidlua 發布:2024-11-13 13:11:01 瀏覽:309
finishandroid 發布:2024-11-13 13:10:26 瀏覽:258
高強度加密大師破解 發布:2024-11-13 13:10:24 瀏覽:191
京東無法訪問 發布:2024-11-13 12:55:38 瀏覽:854
09邁騰高配都有哪些配置 發布:2024-11-13 12:55:35 瀏覽:653
sql重新生成索引 發布:2024-11-13 12:55:22 瀏覽:688
ftp手柄 發布:2024-11-13 12:37:49 瀏覽:913
安卓系列手機最厲害的是什麼手機 發布:2024-11-13 12:36:55 瀏覽:932