麻烦在Mac OS X上使用go 1.3启用cgo交叉编译

时间:2014-07-03 14:54:43

标签: macos go cross-compiling cgo

我尝试使用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

有什么想法吗?感谢。

2 个答案:

答案 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进行交叉编译非常简单:

  • 安装并运行了docker
  • 去获取github.com/karalabe/xgo
  • cd
  • xgo --targets = linux / arm。

关于如何编译还有很多其他选择。