android - 在 Mac for Android 上交叉编译 "Hello World"

标签 android go cross-compiling cgo

我正在尝试构建一个标准的“Hello, World!”适用于 Android 的命令行可执行文件。可执行文件将通过 adb shell 运行。

0。 Go (Golang) 源码

package main

import (
    "fmt"
)

func main() {
    fmt.Println("Hello, world!")
}

1A。构建命令

$ CGO_ENABLED=0 GOOS=android GOARCH=arm GOARM=7 go build .

1B。输出(重新排列换行符以防止滚动条)

# github.com/asukakenji/cross
warning: unable to find runtime/cgo.a
/usr/local/go/pkg/tool/darwin_amd64/link: running clang failed: exit status 1
ld: warning: ignoring file
    /var/folders/dd/6k6vkzbd6d5803xj9zkjdhmh0000gn/T/go-link-150305609/go.o,
    file was built for unsupported file format
    ( 0x7F 0x45 0x4C 0x46 0x01 0x01 0x01 0x00
      0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 )
    which is not the architecture being linked (x86_64):
    /var/folders/dd/6k6vkzbd6d5803xj9zkjdhmh0000gn/T/go-link-150305609/go.o
Undefined symbols for architecture x86_64:
  "_main", referenced from:
     implicit entry/start for main executable
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

1C。再次构建命令

以下命令给出相同的结果:

$ env CGO_ENABLED=0 GOOS=android GOARCH=arm GOARM=7 go build .

2。构建命令(详细)

我试过像这样使用 "-v":

$ CGO_ENABLED=0 GOOS=android GOARCH=arm GOARM=7 go build \
      -x -ldflags "-extldflags -v" .

它给了我 100 多行消息,所以除非必要,否则我不会在这里发布。 go build 命令似乎尝试使用 Xcode bundle 的 clang 编译源代码。

3A。构建命令(成功,但是...)

鉴于找到错误编译器的提示,我尝试这样设置$CC:

$ CGO_ENABLED=0 GOOS=android GOARCH=arm GOARM=7 \
      CC=/path/to/arm-linux-androideabi/bin/clang go build .

arm-linux-androideabimake_standalone_toolchain.py(或 make-standalone-toolchain.sh)的输出。

3B。输出

可执行文件(名为 cross)已成功构建,并显示以下消息:

# github.com/asukakenji/cross
warning: unable to find runtime/cgo.a

我尝试了 adb push 并在 Android 上使用 adb shell 运行它,它工作正常。

我的问题

  1. 为什么需要 C 编译器? Go 不是开箱即用的交叉编译吗?
  2. 为 Linux(而不是 Android)构建时,编译工作正常:

    $ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build .
    

    为什么?

  3. go build 命令一直在寻找 runtime/cgo.a,即使我没有在源代码中使用 CGO,即使我设置了 CGO_ENABLED=0。我怎样才能摆脱警告?没有它有什么害处?

最佳答案

如果您运行该代码,您会发现 android 是一个官方目标平台 列为 GOOS/GOARCH

$go tool dist list

关于android - 在 Mac for Android 上交叉编译 "Hello World",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38948418/

相关文章:

android - 我可以作为应用开发者解决 Play 商店中的 -505 错误吗? (非 Adob​​e air 应用程序)

android - 如何防止我的 Android 应用程序被嗅探?

android - 使用 FCM 时的通知跟踪

go - Python 在 golang 中的 setdefault 模拟

jquery - javascript 和 revel golang 服务器之间的长轮询

unix - log15 库将纪元时间从纳秒舍入到秒以进行日志记录

c++ - 使用 mingw 在 Linux 上交叉编译 Direct3D

android - 如何在Android项目中使用PowerMock?

android - Android 交叉编译时链接器错误

java - 如何在 Java 11 中编写代码,但目标是 Java 8 及更高版本?