You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Yocto 2.4.1下Go交叉编译Recipe外部依赖配置求助

解决Yocto 2.4.1中Go应用外部依赖的问题

我来帮你搞定这个Yocto下Go项目外部依赖的难题!针对你提到的github.com/golang/protobuf/ptypes这类外部依赖,结合Yocto 2.4.1(Rocko)的版本特性,推荐两种实用方案,其中就包含你询问的go-dep用法:

方案一:使用go-dep+Vendor目录(最省心)

这种方式是在本地预先把依赖打包到项目里,Yocto构建时直接使用,不需要在构建过程中拉取依赖,避免网络或环境问题。

步骤1:本地用go-dep生成依赖文件

在你的开发机上完成以下操作:

  1. 安装go-dep:go get github.com/golang/dep/cmd/dep
  2. 进入你的hello-world项目根目录,初始化依赖管理:
    dep init
    
  3. 拉取并锁定所有依赖:
    dep ensure
    
    这一步会生成Gopkg.toml(依赖描述)、Gopkg.lock(依赖版本锁定),同时把所有依赖下载到项目根目录的vendor文件夹里。
  4. 将vendor目录、Gopkg.toml、Gopkg.lock一起提交到你的Git仓库,确保Yocto拉取源码时能获取到这些文件。

步骤2:修改Yocto Recipe

调整后的hello-world_%.bb如下:

LICENSE = "CLOSED"
LIC_FILES_CHKSUM = ""
DESCRIPTION = "Hello world test with golang."
inherit go
COMPATIBLE_MACHINE = "(<machine>)"
DEPENDS = "go-cross-${TARGET_ARCH}"
GO_IMPORT = "hello-world"
SRC_URI = "<git_url>/${GO_IMPORT}.git;branch=${SRCBRANCH};tag=${PV}"
SRCBRANCH = "master"
PV = "0.01"
S = "${WORKDIR}/git"

do_compile() {
    export GOARCH="<machine_arch>"  # 替换为对应架构,比如arm/x86_64
    export GOOS="linux"
    export CGO_ENABLED="0"
    # 直接在源码目录编译,go会自动从vendor目录读取依赖
    go build -o hello-world hello-world.go
}

do_install() {
    install -d "${D}/${bindir}"
    install -m 0755 "${S}/hello-world" "${D}/${bindir}/hello-world"
}

RDEPENDS_${PN}-dev += "bash"

说明:因为vendor目录已经包含了所有外部依赖,编译时无需手动设置GOPATH,Go会自动优先从vendor目录查找依赖。

方案二:在Yocto构建过程中用go-dep拉取依赖

如果不想把vendor目录提交到仓库,可以让Yocto在构建阶段自动拉取依赖,适合依赖经常更新的场景:

修改后的Recipe

LICENSE = "CLOSED"
LIC_FILES_CHKSUM = ""
DESCRIPTION = "Hello world test with golang."
inherit go
COMPATIBLE_MACHINE = "(<machine>)"
# 添加go-native确保构建主机有Go环境
DEPENDS = "go-cross-${TARGET_ARCH} go-native"
GO_IMPORT = "hello-world"
SRC_URI = "<git_url>/${GO_IMPORT}.git;branch=${SRCBRANCH};tag=${PV}"
SRCBRANCH = "master"
PV = "0.01"
S = "${WORKDIR}/git"

# 预编译步骤:安装go-dep并拉取依赖
do_compile_prepend() {
    # 创建自定义GOPATH目录
    export GOPATH="${WORKDIR}/gopath"
    mkdir -p "${GOPATH}/src/${GO_IMPORT}"
    # 将项目源码复制到GOPATH的对应路径下
    cp -r "${S}/"* "${GOPATH}/src/${GO_IMPORT}/"
    cd "${GOPATH}/src/${GO_IMPORT}"
    # 安装go-dep工具
    go get github.com/golang/dep/cmd/dep
    # 拉取所有依赖
    dep ensure
}

do_compile() {
    export GOPATH="${WORKDIR}/gopath"
    export GOARCH="<machine_arch>"
    export GOOS="linux"
    export CGO_ENABLED="0"
    cd "${GOPATH}/src/${GO_IMPORT}"
    go build -o hello-world hello-world.go
}

do_install() {
    install -d "${D}/${bindir}"
    install -m 0755 "${WORKDIR}/gopath/src/${GO_IMPORT}/hello-world" "${D}/${bindir}/hello-world"
}

RDEPENDS_${PN}-dev += "bash"

注意事项:

  • 确保构建环境可以访问外网,否则go get和dep ensure会失败。
  • Yocto 2.4.1的Go版本是1.8.x,完全兼容go-dep(go-dep支持Go 1.6+)。

额外提示

  • 确认GOARCH的值与你的目标架构匹配:比如目标是ARM32架构,填arm;x86_64架构填amd64,要和TARGET_ARCH对应。
  • CGO_ENABLED=0会生成静态编译的二进制文件,不需要依赖目标系统的C库,非常适合嵌入式环境。

内容的提问来源于stack exchange,提问作者krutzio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:01:45