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生成依赖文件
在你的开发机上完成以下操作:
- 安装go-dep:
go get github.com/golang/dep/cmd/dep - 进入你的
hello-world项目根目录,初始化依赖管理:dep init - 拉取并锁定所有依赖:
这一步会生成dep ensureGopkg.toml(依赖描述)、Gopkg.lock(依赖版本锁定),同时把所有依赖下载到项目根目录的vendor文件夹里。 - 将
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
相关产品推荐
相关产品推荐

