动物, 小鸭, 水禽, Tierkind, 雁鸭科, 潜水鸭, 布朗, 可爱, 羽毛, 游泳, 跳水, 性质

在 Linux 机器中编译可在 iOS 设备上运行的 Go 语言程序,是不是感觉很奇妙?

本文以 Ubuntu 系统为例,其他操作系统未测试

首先你得在你的 Linux 机器上编译安装 iOS 工具链
我最近写了一篇教程,解决 iOS 工具链的安装问题,在 Ubuntu 中编译安装 iOS 工具链 (ios-toolchain)

/usr/local/ios-ndk-armv7/usr/local/ios-ndk-arm64
1
export PATH=$PATH:/usr/local/ios-ndk-armv7/bin:/usr/local/ios-ndk-arm64/bin
安装配置 golang

1. 使用 apt-get 安装 golang

12
sudo apt-get updatesudo apt-get install golang

更改 go 的所有者和用户组,为接下来的操作方便

1
sudo chown -R yourUser:yourGroup /usr/lib/go*

2. golang 官网下载安装

我建议去 golang 官网下载安装,以 go1.8.3 为例,golang 将会安装到 /usr/local

12
wget --no-check-certificate https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz
sudo tar zxf go1.8.3.linux-amd64.tar.gz /usr/local

更改 go 的所有者和用户组,为接下来的操作方便

1
sudo chown -R yourUser:yourGroup /usr/local/go*

将 $GOROOT/bin 加入 PATH

1
export PATH=$PATH:/usr/local/go/bin
编译 iOS Go 语言程序

先 clone 我的 example

12

编译 iOS armv7 (darwin/arm) / arm64 (darwin/arm64) 程序

用 go install 安装 iOS std

12345
# iOS armv7 (darwin/arm):CC=arm-apple-darwin11-clang GOOS=darwin GOARCH=arm GOARM=7 CGO_ENABLED=1 go install -tags ios std# iOS arm64 (darwin/arm64):CC=aarch64-apple-darwin11-clang GOOS=darwin GOARCH=arm64 CGO_ENABLED=1 go install -tags ios std

如果前面没有修改 golang 安装目录的所有者,go install 可能会报错
运行成功,会输出以下内容(好吧看不懂)

12345678
# runtime/cgoldid.cpp(602): _assert(): Swap(mach_header_->filetype) == MH_EXECUTE || Swap(mach_header_->filetype) == MH_DYLIB || Swap(mach_header_->filetype) == MH_BUNDLE# netldid.cpp(602): _assert(): Swap(mach_header_->filetype) == MH_EXECUTE || Swap(mach_header_->filetype) == MH_DYLIB || Swap(mach_header_->filetype) == MH_BUNDLE# os/userldid.cpp(602): _assert(): Swap(mach_header_->filetype) == MH_EXECUTE || Swap(mach_header_->filetype) == MH_DYLIB || Swap(mach_header_->filetype) == MH_BUNDLE# pluginldid.cpp(602): _assert(): Swap(mach_header_->filetype) == MH_EXECUTE || Swap(mach_header_->filetype) == MH_DYLIB || Swap(mach_header_->filetype) == MH_BUNDLE

尝试编译 example

arm 编译命令:

1
CC=arm-apple-darwin11-clang GOOS=darwin GOARCH=arm GOARM=7 CGO_ENABLED=1 go build -o hello_world_ios_arm

arm64 编译命令:

1
CC=aarch64-apple-darwin11-clang GOOS=darwin GOARCH=arm64 CGO_ENABLED=1 go build -o hello_world_ios_arm64

不出意外的话,很快就编译成功
用 file 命令查看生成 iOS 程序的详细类型

123
apple@ubuntu:~/Hello-World$ file hello_world_ios_*hello_world_ios_arm:   Mach-O arm_v7 executablehello_world_ios_arm64: Mach-O 64-bit 64-bit architecture=12 executable
亟待完美解决

以上编译出的程序在运行时,会在开头返回一个错误

1
runtime/cgo: no Info.plist URL

实际上, 此错误不会对程序运行造成多大影响,可以忽略,如果想要去除错误,只需在程序所在目录下放置一个名为 Info.plist 的有效文件即可.