5

我尝试使用 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++构建and的路很长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:

未定义:main.main

任何想法?谢谢。

4

2 回答 2

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

于 2014-11-09T20:33:40.227 回答
0

作为替代解决方案,您可以尝试https://github.com/karalabe/xgo

它使涉及 cgo 的交叉编译变得非常简单:

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

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

于 2017-07-03T09:44:15.333 回答