golang 1.4 编译android toolchain的方法

其他平台及架构的toolchain编译我在之前的文章已经简单总结过,其实android的toolchain和之前的toolchain生成非常类似,需要注意以下2点:

1、要通过ndk生成standalone的"ndk-gcc"

2、使用CC_FOR_TARGET=<ndk-gcc>/bin/arm-linux-androideabi-gcc

那么let's go

1、下载NDK,https://developer.android.com/tools/sdk/ndk/index.html

2、通过NDK自带的脚本生成standalone toolchain

<ndk-root>/build/tools/make-standalone-toolchain.sh --platform=android-9 \
    --install-dir=<ndk-gcc> --arch=arm

3、使用standalone toolchain编译golang

进入到<GOROOT>/src

CC_FOR_TARGET=<ndk-gcc>/bin/arm-linux-androideabi-gcc GOOS=android \
    GOARCH=arm GOARM=7 CGO_ENABLED=1 ./make.bash

运行完毕没有错误的话即可生成android的toolchain了

4、使用生成的android toolchain尝试编译一个.so

CC=<ndk-gcc>/bin/arm-linux-androideabi-gcc GOOS=android GOARCH=arm \
    GOARM=7 CGO_ENABLED=1 go build -ldflags="-shared"

使用file命令 file <outputfile>,检查一下生成的文件,格式是否正确

ELF 32-bit LSB  shared object, ARM, EABI5 version 1 (SYSV), dynamically
linked (uses shared libs), not stripped

golang cgo 交叉编译arm目标

使用crosstool-ng make出arm平台的交叉工具链

使用交叉工具链编译cgo需要的库文件以enet为例

先export PATH=交叉工具链bin目录:$PATH

./configure --host=arm-unknown-linux-gnueabi --prefix=/home/pathletboy/armlib/enet

make && make install

接着.go里指示

#cgo linux CFLAGS: -I/home/pathletboy/armlib/enet/include
#cgo linux LDFLAGS: /home/pathletboy/armlib/enet/lib/libenet.a -static

注意-static 为静态编译

上述方法出错的话可以在go build时候传入,别忘记去掉上述-static指示字

go build -ldflags="-extldflags '-static'"

 

最后编译你的go工程

CC=arm-unknown-linux-gnueabi-gcc GOARCH=arm CGO_ENABLED=1 go build -ldflags="-w -s"

步骤没错的话,那么你的bin就已经出来了。


Golang在Windows下建立交叉编译环境

在安装好go后,建立交叉编译环境还需要一个重要的工具链gcc,推荐使用mingw
http://sourceforge.net/projects/mingw/files/Installer/mingw-get-inst/mingw-get-inst-20120426/mingw-get-inst-20120426.exe/download

安装好后,下文假设安装在D:\MinGW下,将D:\MinGW\bin添加到系统环境 %PATH% 中。

然后将下面的批处理文件放置到c:\go\src下后执行
上述建立的交叉编译环境不是完整的,请根据自己需要修改。 交叉编译自己的go应用,比如要编译一个32位的linux。

enjoy!