Golang教程:使用Ubuntu系统编译可在苹果iOS设备上运行的Go语言程序 | Konica 的自留地

Golang教程:使用Ubuntu系统编译可在苹果iOS设备上运行的Go语言程序

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

前言

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

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

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

如果按照这篇教程去做,会在 /usr/local 目录得到两个子目录
/usr/local/ios-ndk-armv7
/usr/local/ios-ndk-arm64
将子目录中的 bin 目录加入 PATH

1
export PATH=$PATH:/usr/local/ios-ndk-armv7/bin:/usr/local/ios-ndk-arm64/bin

安装配置 golang

1. 使用 apt-get 安装 golang

1
2
sudo apt-get update
sudo apt-get install golang

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

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

2. golang官网下载安装

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

1
2
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

1
2
git clone https://github.com/iikira/Hello-World
cd Hello-World

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

用 go install 安装 iOS std

1
2
3
4
5
# 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 可能会报错
运行成功,会输出以下内容(好吧看不懂)

1
2
3
4
5
6
7
8
# 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
# plugin
ldid.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 程序的详细类型

1
2
3
apple@ubuntu:~/Hello-World$ file hello_world_ios_*
hello_world_ios_arm: Mach-O arm_v7 executable
hello_world_ios_arm64: Mach-O 64-bit 64-bit architecture=12 executable

亟待完美解决

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

1
runtime/cgo: no Info.plist URL

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