kivy-ios在Xcode构建失败:符号重复与Pillow模块错误
解决Kivy iOS构建中的重复符号与Pillow导入循环问题
问题1:libfreetype.a与libsdl2_ttf.a的arm64重复符号错误
这是因为sdl2_ttf默认内置编译freetype,而pillow也依赖独立构建的libfreetype.a,导致符号重复。解决步骤:
- 找到kivy-ios toolchain中
sdl2_ttf的recipe文件,路径通常为kivy-ios/recipes/sdl2_ttf/__init__.py - 修改其
build方法中的configure命令,添加--disable-freetype参数,强制sdl2_ttf使用外部已构建的freetype库:def build(self): env = self.get_env() self.run('./configure', '--prefix={}'.format(self.ctx.dist_dir), '--host={}'.format(self.ctx.host), '--disable-freetype', # 新增这一行 env=env) self.run('make install', env=env) - 清理旧构建缓存:
toolchain clean sdl2_ttf freetype pillow - 重新构建依赖:
toolchain build python3 kivy pillow
问题2:Pillow _imaging模块导入错误(PyInit__imaging未定义)
这是因为toolchain pip install kivymd会自动安装依赖,可能覆盖或重新安装了未适配iOS的Pillow版本。解决步骤:
- 确保已通过toolchain完成
python3、kivy、pillow的构建(按上面的方法解决重复符号问题后) - 安装kivymd时跳过依赖安装,避免pip重新拉取Pillow:
toolchain pip install kivymd --no-deps - 检查Xcode项目配置:确认
libpillow.a已添加到项目的Link Binary With Libraries中,且顺序在kivymd相关模块之前
额外排查建议
- 完全清理构建缓存后从头构建,避免残留旧文件:
toolchain clean all - 回退到之前成功构建时的kivy-ios版本(用户之前构建成功,新增页面未加新库,大概率是toolchain版本更新引入的兼容性问题)
- 检查Xcode的Other Linker Flags,可尝试添加
-Wl,-allow-multiple-definition临时绕过重复符号(仅作为临时方案,优先用前面的recipe修改方法)
内容的提问来源于stack exchange,提问作者cryptotheo
相关产品推荐
相关产品推荐

