搭建golang跨平臺編譯環(huán)境

環(huán)境配置

  1. 安裝Docker
  2. 安裝golang
  3. 安裝xgo鏡像及編譯指令
  4. 配置環(huán)境變量

1. 安裝docker

針對Mac和Windows可以直接下載安裝包進行安裝,其他系統(tǒng)可以使用命令行進行安裝.參考鏈接,最后通過docker version 指令進行查看

# Jacen at EveeedeMacBook-Pro.local in ~ [10:51:52] docker version
Client:
Version:      1.12.5
API version:  1.24
Go version:   go1.6.4
Git commit:   7392c3b
Built:        Fri Dec 16 06:14:34 2016
OS/Arch:      darwin/amd64

Server:
Version:      1.12.5
API version:  1.24
Go version:   go1.6.4
Git commit:   7392c3b
Built:        Fri Dec 16 06:14:34 2016
OS/Arch:      linux/amd64

2. 安裝golang

同樣的在Windows和Mac下面都有一鍵安裝包,針對其他系統(tǒng)也是通過命令行進行安裝.參考鏈接,安裝好以后還需要進行環(huán)境變量的配置.

在mac系統(tǒng)和Linux系統(tǒng)下面,Windows配置環(huán)境變量

export GOROOT="/usr/local/go"
export GOPATH="你的工作目錄"  //這里主要是影響到后面需要安裝的xgo

再執(zhí)行g(shù)o env查看是否配置成功:

GOARCH="amd64"
GOBIN=""
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Volumes/Work/go"
GORACE=""
GOROOT="/usr/local/go"
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
CC="clang"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/w4/75xgx41n2bb7mm3m0dxbp0d40000gn/T/go-build003828011=/tmp/go-build -gno-record-gcc-switches -fno-common"
CXX="clang++"
CGO_ENABLED="1"

3. 安裝xgo docker鏡像

xgo的docker鏡像是我們真正的編譯環(huán)境,Github地址

  1. 安裝xgo docker鏡像,這個鏡像大概4.xG,需要花較長的時間下載

    docker pull karalabe/xgo-latest

這里latest指的最新的編譯環(huán)境,如果需要的話也可以指定安裝具體版本的鏡像,在這里,這個版本的差異主要是golang版本的不同,由于編譯的時候可以指定golang版本進行編譯,所以我們直接安裝最新版本即可.

  1. 安裝xgo

    go get github.com/karalabe/xgo

安裝xgo編譯工具,這個工具封裝了go build,簡化了我們的操作.

4. 配置環(huán)境變量

如果我們使用的是bash的話可以將環(huán)境變量配置到.bash_profile中,免去export的過程

使用bash
  1. 在 ~ 目錄下編輯.bash_profile 文件,在末尾添加

    export GOPATH="你的工作目錄"
    export GOROOT="usr/local/go"
    export PATH=$PATH:$GOPATH/bin
    export GOROOT_BOOTSTRAP=$GOROOT

  2. source .bash_profile使得配置文件生效

使用如zsh shell程序
  1. 在~ 目錄下編輯.zshrc 文件,添加上面同樣的文件
  2. 同上source生效

5. 測試xgo交叉編譯環(huán)境是否OK

$ cd $GOPATH/src       // If you have multiple (I have at least 3 in there), change into any, doesn't matter
$ mkdir xgo_test
$ cd xgo_test
$ echo -e 'package main\n import "fmt"\n func main(){\nfmt.Println("Hello")\n}' > main.go
$ xgo .

執(zhí)行完上述命令后在當(dāng)前目錄查看是否有編譯生成的可執(zhí)行文件

6. 打包

  ~ xgo  /Volumes/Public\ Storage/go/src/zhjd()
  ~ xgo --targets=android-14/arm /Volumes/Storage/go/src/zhjd 指定生成Android端專用的會快很多很多,這里的14指的是最小支持SDK版本
Checking docker installation...
Client:
 Version:      1.12.3
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   6b644ec
 Built:        Wed Oct 26 23:26:11 2016
 OS/Arch:      darwin/amd64

Server:
 Version:      1.12.3
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   6b644ec
 Built:        Wed Oct 26 23:26:11 2016
 OS/Arch:      linux/amd64

Checking for required docker image karalabe/xgo-latest... found.
Cross compiling zhjd...
Building locally zhjd...
Assembling toolchain for android-16/arm...
Bootstrapping android-16/arm...
Compiling for android-16/arm...
Assembling toolchain for android-16/386...
Bootstrapping android-16/386...
Compiling for android-16/386...
No API C header specified, skipping android-16/aar... 重點關(guān)注
Compiling for linux/amd64...
Compiling for linux/386...
Bootstrapping linux/arm-5...
Compiling for linux/arm-5...
Cleaning up Go runtime for linux/arm-5...
Bootstrapping linux/arm-6...
Compiling for linux/arm-6...
Cleaning up Go runtime for linux/arm-6...
Bootstrapping linux/arm-7...
Compiling for linux/arm-7...
Cleaning up Go runtime for linux/arm-7...
Compiling for linux/arm64...
Compiling for linux/mips64...
Compiling for linux/mips64le...
Compiling for windows-4.0/amd64...
Compiling for windows-4.0/386...
Compiling for darwin-10.6/amd64...
Compiling for darwin-10.6/386...
Bootstrapping ios-5.0/arm-7...
# runtime/cgo
ldid.cpp(602): _assert(): Swap(mach_header_->filetype) == MH_EXECUTE || Swap(mach_header_->filetype) == MH_DYLIB || Swap(mach_header_->filetype) == MH_BUNDLE
# net
ldid.cpp(602): _assert(): Swap(mach_header_->filetype) == MH_EXECUTE || Swap(mach_header_->filetype) == MH_DYLIB || Swap(mach_header_->filetype) == MH_BUNDLE
# os/user
ldid.cpp(602): _assert(): Swap(mach_header_->filetype) == MH_EXECUTE || Swap(mach_header_->filetype) == MH_DYLIB || Swap(mach_header_->filetype) == MH_BUNDLE
Compiling for ios-5.0/arm-7...
# github.com/mattn/go-sqlite3
ldid.cpp(602): _assert(): Swap(mach_header_->filetype) == MH_EXECUTE || Swap(mach_header_->filetype) == MH_DYLIB || Swap(mach_header_->filetype) == MH_BUNDLE
# github.com/mattn/go-sqlite3
ldid.cpp(602): _assert(): Swap(mach_header_->filetype) == MH_EXECUTE || Swap(mach_header_->filetype) == MH_DYLIB || Swap(mach_header_->filetype) == MH_BUNDLE
Cleaning up Go runtime for ios-5.0/arm-7...
Bootstrapping ios-5.0/arm64...
# runtime/cgo
ldid.cpp(602): _assert(): Swap(mach_header_->filetype) == MH_EXECUTE || Swap(mach_header_->filetype) == MH_DYLIB || Swap(mach_header_->filetype) == MH_BUNDLE
# net
ldid.cpp(602): _assert(): Swap(mach_header_->filetype) == MH_EXECUTE || Swap(mach_header_->filetype) == MH_DYLIB || Swap(mach_header_->filetype) == MH_BUNDLE
# os/user
ldid.cpp(602): _assert(): Swap(mach_header_->filetype) == MH_EXECUTE || Swap(mach_header_->filetype) == MH_DYLIB || Swap(mach_header_->filetype) == MH_BUNDLE
Compiling for ios-5.0/arm64...
# github.com/mattn/go-sqlite3
ldid.cpp(602): _assert(): Swap(mach_header_->filetype) == MH_EXECUTE || Swap(mach_header_->filetype) == MH_DYLIB || Swap(mach_header_->filetype) == MH_BUNDLE
# github.com/mattn/go-sqlite3
ldid.cpp(602): _assert(): Swap(mach_header_->filetype) == MH_EXECUTE || Swap(mach_header_->filetype) == MH_DYLIB || Swap(mach_header_->filetype) == MH_BUNDLE
Cleaning up Go runtime for ios-5.0/arm64...
Cleaning up build environment...

查看編譯生成的文件

?  all ls -al
total 427872
drwxr-xr-x  21 silence  staff       714 Dec 29 11:37 .
drwxr-xr-x+ 29 silence  staff       986 Dec 29 11:37 ..
-rw-r--r--@  1 silence  staff      6148 Dec 29 11:37 .DS_Store
-rwxr-xr-x   1 silence  staff  14633608 Dec 29 11:27 zhjd-android-16-386
drwxr-xr-x   5 silence  staff       170 Dec 29 11:27 zhjd-android-16-aar
-rwxr-xr-x   1 silence  staff  14705872 Dec 29 11:26 zhjd-android-16-arm
-rwxr-xr-x   1 silence  staff  10418780 Dec 29 11:32 zhjd-darwin-10.6-386
-rwxr-xr-x   1 silence  staff  11578172 Dec 29 11:31 zhjd-darwin-10.6-amd64
-rwxr-xr-x   1 silence  staff  11224720 Dec 29 11:34 zhjd-ios-5.0-arm64
-rwxr-xr-x   1 silence  staff  10569184 Dec 29 11:33 zhjd-ios-5.0-armv7
drwxrwxrwx   3 silence  staff       102 Dec 29 11:35 zhjd-ios-5.0-framework
-rwxr-xr-x   1 silence  staff  14611432 Dec 29 11:28 zhjd-linux-386
-rwxr-xr-x   1 silence  staff  17246480 Dec 29 11:27 zhjd-linux-amd64
-rwxr-xr-x   1 silence  staff  13034956 Dec 29 11:28 zhjd-linux-arm-5
-rwxr-xr-x   1 silence  staff  12965808 Dec 29 11:29 zhjd-linux-arm-6
-rwxr-xr-x   1 silence  staff  12939788 Dec 29 11:29 zhjd-linux-arm-7
-rwxr-xr-x   1 silence  staff  17075720 Dec 29 11:29 zhjd-linux-arm64
-rwxr-xr-x   1 silence  staff  18700376 Dec 29 11:30 zhjd-linux-mips64
-rwxr-xr-x   1 silence  staff  18699640 Dec 29 11:31 zhjd-linux-mips64le
-rwxr-xr-x   1 silence  staff   9734407 Dec 29 11:31 zhjd-windows-4.0-386.exe
-rwxr-xr-x   1 silence  staff  10889885 Dec 29 11:31 zhjd-windows-4.0-amd64.exe

可以發(fā)現(xiàn),針對不同平臺生成了不同類型的文件.Android支持生成aar庫文件,iOS支持生成Framework庫文件

平臺實測

Android端測試

  1. 推送到設(shè)備中,之所以不直接推送到app目錄下是因為權(quán)限問題,這里如果提示adb命令不存在同樣的也要把Android SDK中的adb命令配置到環(huán)境變量中

     //直接推送到app目錄下會有權(quán)限問題
     
     adb push zhjd-android-16-arm data/data/com,kingdee.zhihuiji 
     adb: error: failed to copy 'zhjd-android-16-arm' to 'data/data/ com.kingdee.zhihuiji': Permission denied
    
     //所以推送到該目錄下
     
     adb push zhjd-android-16-arm data/local/tmp                
     [100%] data/local/tmp/zhjd-android-16-arm
    
  2. 切換到Android設(shè)備并執(zhí)行該文件,這里只能使用已經(jīng)root的設(shè)備

    adb shell 進入手機命令行
    su 切換超級用戶
    cd /data/local/tmp 
    ./zhjd-android-16-arm

最后在終端會輸出可執(zhí)行文件的執(zhí)行結(jié)果

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末府阀,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異结耀,居然都是意外死亡,警方通過查閱死者的電腦和手機匙铡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門图甜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鳖眼,你說我怎么就攤上這事黑毅。” “怎么了钦讳?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵矿瘦,是天一觀的道長。 經(jīng)常有香客問我愿卒,道長缚去,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任琼开,我火速辦了婚禮易结,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己衬衬,他們只是感情好买猖,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著滋尉,像睡著了一般玉控。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狮惜,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天高诺,我揣著相機與錄音,去河邊找鬼碾篡。 笑死虱而,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的开泽。 我是一名探鬼主播牡拇,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼穆律!你這毒婦竟也來了惠呼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤峦耘,失蹤者是張志新(化名)和其女友劉穎剔蹋,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辅髓,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡泣崩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了洛口。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片矫付。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖绍弟,靈堂內(nèi)的尸體忽然破棺而出技即,到底是詐尸還是另有隱情著洼,我是刑警寧澤樟遣,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站身笤,受9級特大地震影響豹悬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜液荸,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一瞻佛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦伤柄、人聲如沸绊困。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秤朗。三九已至,卻和暖如春笔喉,著一層夾襖步出監(jiān)牢的瞬間取视,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工常挚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留作谭,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓奄毡,卻偏偏與公主長得像折欠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吼过,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,097評論 25 707
  • 一怨酝、編譯源碼的背景環(huán)境 Android源碼編譯有什么困難 AOSP 非常龐大,需要下載那先,但是他是Google家的农猬,...
    千山萬水迷了鹿閱讀 13,518評論 5 17
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)售淡,斷路器斤葱,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 2016年7月19日,單位領(lǐng)導(dǎo)突然找我談話揖闸,說是下一步要調(diào)整工作崗位揍堕,從政工轉(zhuǎn)入辦公室。5年了汤纸,很少寫大型材料和...
    飛翔我心閱讀 216評論 0 0
  • Day 多少了衩茸?不記得。一百多天了贮泞,還在寫楞慈,你真棒! 能打開電腦寫字實屬回光返照啃擦。先是把昨天當(dāng)成了7月的最后一天囊蓝,...
    不要蔥花兩個雞蛋閱讀 415評論 0 0