macOS Ventura下用PyInstaller打包的应用在High Sierra运行失败:缺失符号'_OBJC_CLASS_$_MLModelConfiguration'
你猜的没错,这个问题完全是系统版本兼容性导致的!从错误日志里能清楚看到,onnxruntime_pybind11_state.so这个依赖库是基于Mac OS X 13.3(也就是你打包用的Ventura系统)编译的,而_OBJC_CLASS_$_MLModelConfiguration这个CoreML类是macOS 10.15(Catalina)才新增的API,你的High Sierra(10.13)系统里的CoreML框架根本没有这个类,所以加载时直接触发了缺失符号的错误。
给你几个可行的解决/绕过方案:
方案一:在低版本macOS上重新打包
最稳妥的方式是找一台运行High Sierra(或者至少是Catalina之前的系统)的机器,在上面用PyInstaller重新打包应用。PyInstaller会打包当前系统环境下的依赖库版本,用旧系统打包的话,依赖的CoreML相关符号会自动兼容更低的系统版本,不会引用High Sierra没有的类。没有实体机的话,用虚拟机装个High Sierra也能搞定。方案二:禁用onnxruntime的CoreML加速支持
从错误栈能追踪到问题出在openwakeword依赖的onnxruntime上,而onnxruntime默认启用了CoreML硬件加速,这才牵扯到了高版本系统的API。你可以强制让它禁用CoreML:- 在你的Python代码最开头加入这两行,提前设置环境变量:
import os os.environ['ONNXRUNTIME_DISABLE_COREML'] = '1' - 然后用PyInstaller重新打包,这样
onnxruntime就不会加载CoreML相关的代码,自然也就不会引用那个缺失的符号了。记得测试一下禁用后语音功能是否正常,虽然没了硬件加速,但至少能在旧系统跑起来。
- 在你的Python代码最开头加入这两行,提前设置环境变量:
方案三:指定PyInstaller的最低兼容系统版本
打包时可以通过--osx-version-min参数指定最低支持的macOS版本,针对High Sierra就是10.13:pyinstaller --osx-version-min=10.13 your_main_script.py [其他打包参数]注意:这个参数只是告诉系统应用的最低兼容版本,没法直接修改第三方依赖库的编译版本,所以最好配合方案二一起使用,效果会更好。
备注:内容来源于stack exchange,提问作者GaryMBloom

