macos - 在 Mac OS X 上使用 go 1.3 启用 cgo 进行交叉编译时出现问题

标签 macos go cross-compiling cgo

我尝试使用 Go 1.3 在我的 darwin/amd64 MBP 上将 cgo 代码交叉编译到 linux/arm,但没有成功:(

我的环境:

go版本go1.3 darwin/amd64

我的目标:

针对linux/arm交叉编译cgo代码。

第一步:

使用 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:错误:无法识别的命令行选项“-m64”

对于 linux/arm:

GOOS=linux GOARCH=arm go install package/of/test

失败

runtime.main: call to external function main.main runtime.main:

undefined: main.main

有什么想法吗?谢谢。

最佳答案

在 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 ./制作.bash

为 RANLIB 添加目标,像这样(我不确定)

须藤 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

关于macos - 在 Mac OS X 上使用 go 1.3 启用 cgo 进行交叉编译时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24557057/

相关文章:

macos - sbt - Scala - Brew - MacOS - 根本无法连接到 sbt shell : NoClassDefFoundError

go - 使用ghemawat/stream在go中的片段上应用流序列

pointers - 如何设计具有可修改字段的结构?

swift - OSX/Swift 获取最前面运行的应用程序

macos - MAC 对 MP3 的 "say"命令

objective-c - NSScrollView 剪辑文档 View 而不是允许它滚动

go - 如何在 Go 中将 websocket 与 NewServeMux 一起使用?

gcc - 如何使用 ARM 的 OpenMAX 开发层 (DL) 进行构建和解码

c - 使用 arm-none-eabi-gcc 编译 hello world 程序 C 时出错

c++ - 交叉编译c++到iphone arm