zhongcanw 2020-04-23
Golang 支持的平台非常多, 运行go tool dist list
查看已支持的所有平台
appledeimac:Hello-World apple$ go version go version go1.8.3 darwin/amd64 appledeimac:Hello-World apple$ go tool dist list android/386 android/amd64 android/arm android/arm64 darwin/386 darwin/amd64 darwin/arm darwin/arm64 dragonfly/amd64 freebsd/386 freebsd/amd64 freebsd/arm linux/386 linux/amd64 linux/arm linux/arm64 linux/mips linux/mips64 linux/mips64le linux/mipsle linux/ppc64 linux/ppc64le linux/s390x nacl/386 nacl/amd64p32 nacl/arm netbsd/386 netbsd/amd64 netbsd/arm openbsd/386 openbsd/amd64 openbsd/arm plan9/386 plan9/amd64 plan9/arm solaris/amd64 windows/386 windows/amd64 |
iOS 系统内核为 darwin,CPU架构为ARM。
ARM处理器,因其功耗低和尺寸小而闻名,几乎所有的手机处理器都基于ARM,苹果当然也不例外。
arm(32位元),arm64(64位元)
arm64设备:iPhone 5s 及以上、iPad Air 及以上
arm设备:iPhone 5s 以下,iPad 4 及以下
可以看到,Golang版本为1.8.3,支持以下两个平台
1 2 3 | darwin/arm darwin/arm64 |
说明这个版本的Golang是支持iOS的
但是不能像编译 windows,linux 程序那样编译iOS程序,否则可能会编译报错,或者编译出的程序不能正常运行.
使用go env
查看go的环境变量
appledeimac:Hello-World apple$ go env GOARCH=”amd64″ GOBIN=”” GOEXE=”” GOHOSTARCH=”amd64″ GOHOSTOS=”darwin” GOOS=”darwin” GOPATH=”/Volumes/KINSTON/Golang” GORACE=”” GOROOT=”/usr/local/go” GOTOOLDIR=”/usr/local/go/pkg/tool/darwin_amd64″ GCCGO=”gccgo” CC=”/Users/apple/my/bin/aarch64-linux-android-4.9/bin/aarch64-linux-android-gcc” GOGCCFLAGS=”-fPIC -m64 -pthread -fmessage-length=0 -fno-common” CXX=”clang++” CGO_ENABLED=”1″ PKG_CONFIG=”pkg-config” CGO_CFLAGS=”-g -O2″ CGO_CPPFLAGS=”” CGO_CXXFLAGS=”-g -O2″ CGO_FFLAGS=”-g -O2″ CGO_LDFLAGS=”-g -O2″ |
可以看到 CC的值为 /Users/apple/my/bin/aarch64-linux-android-4.9/bin/aarch64-linux-android-gcc
,这里要将CC设为$GOROOT/misc/ios/clangwrap.sh
$GOROOT 为 Golang 默认的安装目录,在 OS X 为 /usr/local/go
, 在Windows系统为C:\Go
此外还要将 CGO_ENABLED 设为 1 ,否则可能会编译报错,或者编译出的程序不能正常运行
1 2 | CC=/usr/local/go/misc/ios/clangwrap.sh GOOS=darwin GOARCH=arm64 CGO_ENABLED=1 go build |
不出意外的话,编译成功,可执行二进制程序在该目录生成。使用file
命令查看文件类型
1 2 3 | appledeimac:Hello-World apple$ file Hello-World Hello-World: Mach-O 64-bit executable arm64 |
接下来给程序签名,否则程序在iOS设备运行时可能会返回Killed: 9
错误
使用 ldid -S
为程序签名
1 2 | ldid -S Hello-World |
如果没有安装 ldid , 先安装 Homebrew,用 brew 命令安装 ldid
1 2 | brew install ldid |
输入 ldid 验证是否安装成功
appledeimac:~ apple$ ldid usage: ldid -S[entitlements.xml] <binary> ldid -e MobileSafari ldid -S cat ldid -Stfp.xml gdb |
1 2 | CC=/usr/local/go/misc/ios/clangwrap.sh GOOS=darwin GOARCH=arm CGO_ENABLED=1 go build |
编译时可能会报错找不到crt1.3.1.o
,这是因为高版本的 Xcode 已经去掉了这个文件,有以下解决方案
crt1.3.1.o
,路径大致为/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/crt1.3.1.o
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/
目录中使用file
命令查看文件类型
1 2 3 | appledeimac:Hello-World apple$ file Hello-World Hello-World: Mach-O executable arm_v7 |
以上编译出的程序在运行时,会在开头返回一个错误
runtime/cgo: no Info.plist URL |
实际上, 此错误不会对程序运行造成多大影响,可以忽略,如果想要去除错误,只需在程序所在目录下放置一个名为 Info.plist 的有效文件即可.