Golang中使用CGO编译时遇到错误怎么办?

Golang中使用CGO编译时遇到错误怎么办? 我遇到了一个问题 我在Ubuntu上编译了一个运行在Android arm7上的原生ELF二进制文件。

Export GOOS=android
Export GOARCH=arm
Export GOARM=7
Export CGO_ENABLED=1

Export CGO_CFLAGS="-g -O2 --sysroot=/mnt/d/sdk/android/android-ndk-r14b-linux/android-24/arch-arm"
Export CGO_LDFLAGS="–sysroot=/mnt/d/sdk/android/android-ndk-r14b-linux/android-24/arch-arm"
Export CC=arm-linux-androideabi-gcc
Export CC_FOR_TARGET=arm-linux-androideabi-gcc
Export CXX=arm-linux-androideabi-g++

runtime/cgo

_cgo_export.c:3:20: fatal error: stdlib.h: No such file or directory #include <stdlib.h>

我该如何解决这个错误?


更多关于Golang中使用CGO编译时遇到错误怎么办?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

你好,Bill,

首先声明,我对交叉编译 cgo 没有经验,但是否有针对 arm-7 的特定 libc 源码包,并且你已经安装了呢?

我在 GitHub 上找到了一个用于 cgo 交叉编译的库:https://github.com/karalabe/xgo/

也许这能帮到你?

更多关于Golang中使用CGO编译时遇到错误怎么办?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


非常感谢 我已经解决了这个问题。

GO111MODULE=""
GOARCH="arm"
GOBIN=""
GOCACHE="/home/dev/.cache/go-build"
GOENV="/home/dev/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GONOPROXY=""
GONOSUMDB=""
GOOS="android"
GOPATH="/mnt/d/tmp/arm7_android"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
GOARM="7"
AR="ar"
CC="arm-linux-androideabi-gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2 --sysroot=/mnt/d/sdk/android/android-ndk-r14b-linux/platforms/android-24/arch-arm"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="–sysroot=/mnt/d/sdk/android/android-ndk-r14b-linux/platforms/android-24/arch-arm"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -marm -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build291331330=/tmp/go-build -gno-record-gcc-switches"

config --sysroot path CC=arm-linux-androideabi-gcc

这个错误是因为编译器找不到标准C库头文件。问题出在CGO_CFLAGS中的--sysroot路径设置不正确,NDK的头文件路径需要指向usr/include所在的目录。

以下是修正后的环境变量设置:

export GOOS=android
export GOARCH=arm
export GOARM=7
export CGO_ENABLED=1

# 关键修正:使用NDK根目录作为sysroot,而不是平台目录
export NDK=/mnt/d/sdk/android/android-ndk-r14b-linux
export SYSROOT=$NDK/platforms/android-24/arch-arm

export CGO_CFLAGS="--sysroot=$SYSROOT -I$NDK/sysroot/usr/include -I$NDK/sysroot/usr/include/arm-linux-androideabi"
export CGO_LDFLAGS="--sysroot=$SYSROOT"
export CC=arm-linux-androideabi-gcc

如果仍然有问题,可以尝试使用NDK中的clang编译器:

export NDK=/mnt/d/sdk/android/android-ndk-r14b-linux
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64

export CC=$TOOLCHAIN/bin/armv7a-linux-androideabi24-clang
export CGO_CFLAGS="--target=armv7a-linux-androideabi24"
export CGO_LDFLAGS="--target=armv7a-linux-androideabi24"

对于包含C代码的Go文件,确保正确使用cgo指令:

// example.go
package main

/*
#include <stdlib.h>
#include <stdio.h>

void hello_from_c() {
    printf("Hello from C\n");
}
*/
import "C"

func main() {
    C.hello_from_c()
}

编译命令示例:

# 使用修正后的环境变量
go build -o app_android_arm example.go

如果遇到链接器错误,可能需要指定额外的库路径:

export CGO_LDFLAGS="--sysroot=$SYSROOT -L$SYSROOT/usr/lib -L$NDK/sysroot/usr/lib/arm-linux-androideabi"
回到顶部