2

我正在尝试使用 go 制作一个跨平台的本机库,并找到了 gomobile 的教程。但是,当我尝试初始化它时(即使我给出了 Android NDK 路径,尽管我没有在下面的示例中)它似乎失败了,因为它找不到stdlib.h.

我试图对 cgo 进行一些调查,但没有任何反应,希望更熟悉生态系统的人可以为我指明正确的方向。

$ gomobile init
gomobile: go install -gcflags=-shared -ldflags=-shared -pkgdir=/Users/myusername/go/pkg/gomobile/pkg_android_arm std failed: exit status 2
# runtime/cgo
_cgo_export.c:2:10: fatal error: 'stdlib.h' file not found

我的环境...(我在 OS X El Capitan 上,全新安装 go1.9 darwin/amd64)

$ go env
GOARCH="amd64"
GOBIN=""
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/myusername/go"
GORACE=""
GOROOT="/usr/local/go"
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
GCCGO="gccgo"
CC="clang"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/rx/l7pzlrld2mqczrfb36t536hh0000gp/T/go-build735124167=/tmp/go-build -gno-record-gcc-switches -fno-common"
CXX="clang++"
CGO_ENABLED="1"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"

编辑:(添加失败初始化的详细输出)

$ gomobile初始化-v

# 安装 golang.org/x/mobile/gl。

# 安装 golang.org/x/mobile/app.

# 安装 golang.org/x/mobile/exp/app/debug.

# 为 android/arm 安装 std。
运行时/内部/系统
运行时/内部/原子
运行
同步/原子
统一码
内部/种族
错误
unicode/utf8
数学
数学/位
容器/列表
容器/环
加密/微妙
加密/内部/密码
内部/网络跟踪
运行时/cgo
供应商/golang_org/x/crypto/poly1305
同步
编码
unicode/utf16
图像/颜色
内部/CPU
内部/系统调用/窗口
内部/系统调用/Windows/注册表
图像/颜色/调色板
内部/系统调用/windows/sysdll
io
系统调用
内部/单程
运行时/比赛
# 运行时/cgo
_cgo_export.c:2:10:致命错误:找不到“stdlib.h”文件
供应商/golang_org/x/text/secure
供应商/golang_org/x/text/unicode
字节
字符串
哈希
密码/密码
运行时/跟踪
哈希/CRC32
哈希/adler32
加密/hmac
哈希/CRC64
哈希/fnv
供应商/golang_org/x/text/transform
文本/制表机
布菲欧
小路
html
字符串转换
数学/兰特
数学/cmplx
时间
内部/系统调用/unix
反映
加密/aes
加密货币
加密/rc4
编码/base64
编码/base32
编码/ascii85
加密/sha512
加密/md5
加密/sha1
加密/sha256
图片
内部/民意调查
图像/内部/imageutil
图像/绘图
图片/JPEG
操作系统
操作系统/信号
fmt
种类
编码/二进制
路径/文件路径
压缩/bzip2
编码/pem
容器/堆
正则表达式/语法
运行时/调试
加密/DES
供应商/golang_org/x/crypto/chacha20poly1305/internal/chacha20
供应商/golang_org/x/crypto/curve25519
供应商/golang_org/x/crypto/chacha20poly1305
io/ioutil
压缩/扁平化
语境
存档/tar
数学/大
压缩/lzw
编码/十六进制
调试/矮人
调试/gosym
调试/plan9obj
数据库/sql/驱动程序
编码/csv
编码/gob
编码/json
数据库/sql
编码/xml
存档/压缩
压缩/gzip
压缩/zlib
调试/男子气概
调试/精灵
调试/PE
日志
供应商/golang_org/x/net/http2/hpack
供应商/golang_org/x/text/unicode/bidi
供应商/golang_org/x/text/unicode/norm
网络/网址
哑剧
哑剧/引用可打印
网络/http/内部
旗帜
加密/dsa
加密/椭圆
编码/asn1
加密货币/兰特
去/令牌
去/扫描仪
加密/rsa
供应商/golang_org/x/text/secure/bidirule
正则表达式
文本/模板/解析
前进/前进
去/常数
操作系统/执行
文本/扫描仪
加密/ecdsa
加密/x509/pkix
图片/gif
图片/png
供应商/golang_org/x/net/idna
索引/后缀数组
测试
内部/跟踪
运行时/pprof
文本/模板
网络/内部/socktest
操作系统/用户
运行时/pprof/内部/配置文件
测试/iotest
测试/快速
去/解析器
去/打印机
测试/内部/testdeps
内部/测试环境
去/文档
html/模板
去/类型
去/格式
去/建造
去/内部/gccgoimporter
去/内部/gcimporter
去/内部/srcimporter
去/进口商
gomobile:去安装 -gcflags=-shared -ldflags=-shared -pkgdir=/Users/myusername/go/pkg/gomobile/pkg_android_arm -v std 失败:退出状态 2
4

1 回答 1

0

go1.10 darwin/amd64即使修补了issue21802,该问题仍然存在。

如果go install -gcflags=-shared -ldflags=-shared -pkgdir=/Users/myusername/go/pkg/gomobile/pkg_android_arm std可以自行运行它会成功,假设问题是运行时 ENV 问题,则有一种解决方法。

解决这个问题的诀窍:

1.go install -gcflags=-shared -ldflags=-shared -pkgdir=/Users/myusername/go/pkg/gomobile/pkg_android_arm std手动运行。确保它安装成功

2.然后沉默installStd在里面init.go

go/src/golang.org/x/mobile/cmd/gomobile/init.go (around Line 165-175)
// Install standard libraries for cross compilers.
start := time.Now()
//if ndkRoot != "" {
    // Ideally this would be -buildmode=c-shared.
    // https://golang.org/issue/13234.
    // androidArgs := []string{"-gcflags=-shared", "-ldflags=-shared"}
    // for _, arch := range archs {
        // env := androidEnv[arch]
        // if err := installStd(env, androidArgs...); err != nil {
            // return err
        // }
    // }
//}

3.再次安装解决方法gomobile:go install golang.org/x/mobile/cmd/gomobile

4.gomobile init再次运行。

于 2018-02-24T13:58:20.003 回答