如何编写Yocto Recipe编译Go语言的mediamtx RTSP服务器?
解决Yocto构建mediamtx(Go语言RTSP服务器)无二进制生成的问题
以下是修正后的完整Yocto Recipe,以及关键修改点的说明:
完整Recipe代码
SUMMARY = "mediamtx RTSP server" HOMEPAGE = "https://github.com/bluenviron/mediamtx" SECTION = "multimedia" LICENSE = "MIT" # 继承Go语言构建核心类与架构适配类 inherit go goarch pkgconfig # 指定Go模块导入路径,是Yocto识别Go项目的关键 GO_IMPORT = "github.com/bluenviron/mediamtx" LIC_FILES_CHKSUM = "file://LICENSE;md5=77fd2623bd5398430be5ce60489c2e81" SRC_URI = "git://github.com/bluenviron/mediamtx;branch=main;protocol=https" S = "${WORKDIR}/git" SRCREV = "21756a4d54152872cda48469861147ee652df922" # 明确要打包的文件路径 FILES:${PN} += "${bindir}/${BPN}" FILES:${PN} += "${datadir}/mediamtx/" # 依赖项:Go编译环境与Python3(用于项目构建脚本) DEPENDS += "go python3" # 编译逻辑:适配Go Modules与跨架构编译 do_compile() { export GO111MODULE=on export CGO_ENABLED=1 # 编译主入口,指定输出二进制路径 go build -v -o ${B}/mediamtx ./cmd/mediamtx } # 安装逻辑:部署二进制与默认配置文件 do_install() { # 创建二进制目录并安装 install -d ${D}${bindir} install -m 0755 ${B}/mediamtx ${D}${bindir}/${BPN} # 安装默认配置文件到数据目录 install -d ${D}${datadir}/${BPN} install -m 0644 ${S}/mediamtx.yml ${D}${datadir}/${BPN}/ }
关键修改点说明
修正继承的bbclass
将原goarch替换为go goarch:go.bbclass提供Go项目构建的核心逻辑,goarch自动处理跨架构编译的环境变量(如GOOS、GOARCH),两者结合才能正常触发Go编译流程。启用GO_IMPORT
取消注释GO_IMPORT,这是Yocto识别Go模块路径的核心配置,确保构建系统正确解析项目依赖关系。添加do_compile段
- 开启Go Modules(
GO111MODULE=on):mediamtx使用Go Modules管理依赖,必须开启才能正确拉取和编译依赖。 - 启用CGO(
CGO_ENABLED=1):项目依赖部分C语言库,关闭会导致编译失败。 - 指定编译入口:mediamtx的主程序入口在
cmd/mediamtx目录,通过go build指定输出路径到构建目录${B}。
- 开启Go Modules(
完善do_install逻辑
替代原do_install_append,手动创建目录并安装二进制,同时添加默认配置文件的部署,保证目标系统能直接使用默认配置启动服务。依赖与文件路径调整
- 将
python改为python3,适配Yocto新版本的Python环境规范。 - 明确
FILES:${PN}路径,避免打包时遗漏二进制和配置文件。
- 将
验证方法
构建完成后,在tmp/deploy/ipk/或对应包格式的目录下找到生成的mediamtx包,解压后检查usr/bin/mediamtx和usr/share/mediamtx/mediamtx.yml是否存在。
内容的提问来源于stack exchange,提问作者Akkshay
相关产品推荐
相关产品推荐

