Yocto无法交叉编译GoLang Wails应用的解决方法咨询
问题
我正在使用Yocto Kirkstone为ARMv7自定义嵌入式Linux板构建系统,Yocto元层中包含Go Runtime 1.20版本。尝试构建一个简单的Go语言Wails示例应用,该应用能在Mac上为目标平台构建,但需要安装Wails CLI才能编译。不清楚如何在Yocto中交叉编译该应用,特此寻求解决方法。
在do_compile()中执行wails build .命令失败,报错信息如下:
... | HASH[link github.com/wailsapp/wails/v2/cmd/wails]: "packagefile internal/lazyregexp=PNiPFusr6BDvpzrFOO2q " | HASH[link github.com/wailsapp/wails/v2/cmd/wails]: 58443e84e42fc0e5254356b82561065095a39a1606a457c34cf63d8dd364173c | HASH subkey a9f4ce5dc6a5c97cab06b5c8cfec3a64e5db0f7bcc79e02fc0002cafcc719a67 "link-stdout" = 80ee6464b934ca7407296396849147804b0862ee25e2b844a6e9cc98cfa588b3 | qemu-arm: Could not open '/lib/ld-linux-armhf.so.3': No such file or directory | WARNING: /home/sensonix/poky/build-microchip/tmp/work/cortexa5t2hf-neon-vfpv4-poky-linux-gnueabi/go-example/1.0.0-r0/temp/run.do_compile.87405:178 exit 255 from './bin/linux_arm/wails build .' | WARNING: Backtrace (BB generated script): | #1: do_compile, /home/sensonix/poky/build-microchip/tmp/work/cortexa5t2hf-neon-vfpv4-poky-linux-gnueabi/go-example/1.0.0-r0/temp/run.do_compile.87405, line 178 | #2: main, /home/sensonix/poky/build-microchip/tmp/work/cortexa5t2hf-neon-vfpv4-poky-linux-gnueabi/go-example/1.0.0-r0/temp/run.do_compile.87405, line 186
对应的Bitbake配方如下:
DESCRIPTION = "Wails Example App" LICENSE = "CLOSED" LIC_FILES_CHKSUM="" SRC_URI = "file://wails.json" SRC_URI += "file://README.md" SRC_URI += "file://main.go" SRC_URI += "file://app.go" SRC_URI += "file://frontend" GO_IMPORT = "import" GO_LINKSHARED = "" PTEST_ENABLED="0" export GO111MODULE="auto" CGO_ENABLED = "1" inherit go goarch do_compile() { cd ${WORKDIR}/build export TMPDIR="${GOTMPDIR}" ${GO} install github.com/wailsapp/wails/v2/cmd/wails@latest export GOPATH="$GOPATH:${S}/src/import/.gopath" # Pass the needed cflags/ldflags so that cgo # can find the needed headers files and libraries export CGO_CFLAGS="${CFLAGS} --sysroot=${STAGING_DIR_TARGET}" export CGO_LDFLAGS="${LDFLAGS} --sysroot=${STAGING_DIR_TARGET}" ./bin/linux_arm/wails build . #${GO} build ${GO_LINKSHARED} ${GOBUILDFLAGS} -o streamerapp cd ${OLDPWD} } do_install() { cd ${WORKDIR}/build #install -m <permisions> SRC DEST mkdir -p ${D}${bindir} #install -m 0755 ./wailsapp ${D}${bindir} cd ${OLDPWD} }
解决方案
1. 修复QEMU动态链接器找不到的问题
报错核心是QEMU无法定位目标ARM架构的动态链接器,需在do_compile中添加环境变量指定目标sysroot:
export QEMU_LD_PREFIX="${STAGING_DIR_TARGET}"
同时确保构建环境已包含meta-oe层,该层提供QEMU交叉支持组件,且qemu-arm-static已安装。
2. 调整Wails CLI的使用方式
直接编译ARM版本的Wails CLI并运行会依赖目标架构库,易出兼容性问题,可改为:
- 编译**主机架构(x86_64)**的Wails CLI,无需QEMU即可直接运行:
GOOS=linux GOARCH=amd64 ${GO} install github.com/wailsapp/wails/v2/cmd/wails@latest - 调用主机版CLI执行交叉编译,指定目标平台:
${GOPATH}/bin/wails build -platform linux/arm/v7 .
3. 完善交叉编译环境变量
确保Go与CGO的交叉编译参数正确:
export GOOS=linux export GOARCH=arm export GOARM=7 export CGO_ENABLED=1 # 指定目标架构的交叉编译器 export CC="${TARGET_PREFIX}gcc" export CXX="${TARGET_PREFIX}g++"
4. 修改后的Bitbake配方示例
更新do_compile部分如下:
do_compile() { cd ${WORKDIR}/build export TMPDIR="${GOTMPDIR}" # 编译主机版本的Wails CLI GOOS=linux GOARCH=amd64 ${GO} install github.com/wailsapp/wails/v2/cmd/wails@latest export GOPATH="$GOPATH:${S}/src/import/.gopath" # 配置交叉编译环境 export GOOS=linux export GOARCH=arm export GOARM=7 export CGO_ENABLED=1 export CC="${TARGET_PREFIX}gcc" export CXX="${TARGET_PREFIX}g++" export CGO_CFLAGS="${CFLAGS} --sysroot=${STAGING_DIR_TARGET}" export CGO_LDFLAGS="${LDFLAGS} --sysroot=${STAGING_DIR_TARGET}" export QEMU_LD_PREFIX="${STAGING_DIR_TARGET}" # 交叉编译Wails应用 ${GOPATH}/bin/wails build -platform linux/arm/v7 . cd ${OLDPWD} }
5. 添加应用依赖库
Wails应用依赖GTK3等UI库,需在配方中添加依赖:
DEPENDS += "gtk3 glib-2.0"
内容的提问来源于stack exchange,提问作者PhilBot
相关产品推荐
相关产品推荐

