我尝试使用Go 1.3在我的darwin / amd64 MBP上将cgo代码交叉编译到linux / arm,但结果却没有运气:(
我的环境:
go version go1.3 darwin/amd64
我的目标:
交叉编译针对linux / arm的cgo代码。
第1步:
使用ct-ng构建gcc / g ++交叉编译器。构建arm-unknown-linux-gnueabi-g++
和arm-unknown-linux-gnueabi-gcc
还有很长的路要走,但我终于做到了。我测试了简单的C / C ++程序,输出在我的linux / arm R-Pi盒子上工作正常。
第2步:
cd / path / to / go / src
sudo CGO_ENABLED = 1 CC_FOR_TARGET = / path / to / arm-unknown-linux-gnueabi-gcc CXX_FOR_TARGET = / path / to / arm-unknown-linux-gnueabi -g ++ GOOS = linux GOARCH = arm ./make.bash
一切都建好了。
第3步:
编译以下简单的cgo代码:
package main
/*
#include <stdio.h>
#include <stdlib.h>
*/
import "C"
import (
"unsafe"
)
func main() {
str := C.CString("abc\n")
C.printf(str)
C.free(unsafe.Pointer(str))
}
对于我的主机:
go install package/of/test
失败
arm-unknown-linux-gnueabi-gcc: error: unrecognized command line option '-m64'
对于linux / arm:
GOOS=linux GOARCH=arm go install package/of/test
失败
runtime.main:调用外部函数main.main runtime.main:
undefined:main.main
有什么想法吗?感谢。
答案 0 :(得分:0)
在Mac上交叉编译Android时遇到同样的问题。希望对你有所帮助。
在第2步:
sudo CGO_ENABLED=1 CC_FOR_TARGET=/path/to/arm-unknown-linux-gnueabi-gcc CXX_FOR_TARGET=/path/to/arm-unknown-linux-gnueabi-g++ GOOS=linux GOARCH=arm ./make.bash
为RANLIB添加目标,就像这样(我不确定)
sudo CGO_ENABLED=1 CC_FOR_TARGET=/path/to/arm-unknown-linux-gnueabi-gcc CXX_FOR_TARGET=/path/to/arm-unknown-linux-gnueabi-g++ RANLIB_FOR_TARGET=/path/to/arm-unknown-linux-gnueabi-ranlib GOOS=linux GOARCH=arm ./make.bash
答案 1 :(得分:0)
作为替代解决方案,您可以尝试https://github.com/karalabe/xgo。
使用cgo进行交叉编译非常简单:
关于如何编译还有很多其他选择。