Mac M1下py2app打包应用libffi.8.dylib导入错误求助
解决方案:M1 Mac py2app打包后libffi依赖缺失问题
以下是针对你遇到的_ctypes.so无法加载libffi.8.dylib问题的针对性解决方法:
方案一:手动修正依赖路径(快速临时修复)
- 复制Homebrew中的libffi到App的Frameworks目录:
cp /opt/homebrew/opt/libffi/lib/libffi.8.dylib /Users/raphaelpbp/Desktop/PP/dist/test_generator.app/Contents/Frameworks/ - 修改
_ctypes.so的依赖指向,使其指向App包内的libffi:install_name_tool -change @rpath/libffi.8.dylib @executable_path/../Frameworks/libffi.8.dylib /Users/raphaelpbp/Desktop/PP/dist/test_generator.app/Contents/Resources/lib/python3.9/lib-dynload/_ctypes.so - 修正libffi自身的路径标识,避免后续依赖问题:
install_name_tool -id @executable_path/../Frameworks/libffi.8.dylib /Users/raphaelpbp/Desktop/PP/dist/test_generator.app/Contents/Frameworks/libffi.8.dylib
方案二:修改setup.py强制嵌入libffi(打包时彻底解决)
在你的setup.py中添加参数,让py2app自动将libffi打包进App,并配置正确的运行路径:
from setuptools import setup APP = ['你的主脚本文件名.py'] OPTIONS = { 'argv_emulation': True, # 指定要嵌入的libffi库路径 'frameworks': ['/opt/homebrew/opt/libffi/lib/libffi.8.dylib'], 'plist': { # 配置运行时的框架路径 'LSEnvironment': { 'DYLD_FRAMEWORK_PATH': '@executable_path/../Frameworks' } } } setup( app=APP, options={'py2app': OPTIONS}, setup_requires=['py2app'], )
重新打包(先试用开发模式验证):
export LDFLAGS="-L/opt/homebrew/opt/libffi/lib" export CPPFLAGS="-I/opt/homebrew/opt/libffi/include" export PKG_CONFIG_PATH="/opt/homebrew/opt/libffi/lib/pkgconfig" python setup.py py2app -A
方案三:切换到Brew/Python官方版本(规避Conda兼容性问题)
Conda的Python在M1架构下可能存在链接库适配问题,尝试使用Brew安装的Python:
- 安装Brew版Python:
brew install python - 创建并激活虚拟环境:
python3 -m venv py2app_env source py2app_env/bin/activate - 安装依赖和py2app:
pip install 你的项目依赖包 py2app - 直接打包(无需额外环境变量,Brew Python已正确关联libffi):
python setup.py py2app
验证方法:运行App包内的可执行文件dist/test_generator.app/Contents/MacOS/test_generator,检查是否仍有导入错误。
内容的提问来源于stack exchange,提问作者Raphael Piovezan
相关产品推荐
相关产品推荐

