Yocto编译TensorFlow时zipfile.py出现struct.error错误该如何解决
根因说明
你遇到的struct.error: ushort format requires 0 <= number <= (0x7fff * 2 + 1)报错,本质是zipfile模块的FileHeader方法在打包时,某个需要用16位无符号整数存储的字段值超出了0~65535的合法范围。结合你之前修改zipfile源码修复时间戳的操作,触发问题的核心原因是直接修改系统原生zipfile模块引入了兼容冲突,同时没有从构建流程层面统一处理时间戳问题。
可行解决方案
- 第一步先还原你对
recipe-sysroot-native/usr/lib/python3.8/zipfile.py的所有修改,不要直接修改Yocto构建过程中生成的临时系统库文件,这类修改会被构建流程自动重置,还会引入不可预期的兼容问题。 - 在Yocto的
conf/local.conf中添加全局配置:
这个值对应1980-01-01 00:00:00的UNIX时间戳,Yocto会在整个构建流程中统一将所有生成文件的时间戳设为该值,从根源解决zip打包的时间戳报错,不需要修改zipfile源码。SOURCE_DATE_EPOCH = "315532800" - 如果报错发生在TensorFlow wheel包打包阶段,可在TensorFlow的.bb或.bbappend文件的构建步骤前添加环境变量配置:
TensorFlow 1.13版本的构建脚本会直接读取该变量作为zip打包的默认时间。export ZIP_TIMESTAMP="1980-01-01 00:00:00" - 如果仍报错,在TensorFlow构建的
do_configure前置步骤中添加批量修改源码时间戳的操作:find ${S} -type f -exec touch -d "1980-01-01 00:00:00" {} \; - 若打包的文件数量超过65535或单文件大小超过4G,需要在构建脚本调用
ZipFile的位置添加allowZip64=True参数,关闭16位字段长度限制。
内容的提问来源于stack exchange,提问作者Cheran Prakasam
相关产品推荐
相关产品推荐

