将Framework嵌入另一框架内部使用时遇dyld崩溃,求解决方案
这种dyld的__abort_with_payload崩溃,大概率是动态链接器找不到你内嵌的依赖框架,或者配置里的路径、签名出了问题。结合你已经做的操作,我给你梳理几个必须检查和调整的步骤:
确认Copy Files阶段的目标配置
打开主框架的Copy Files阶段,确保Destination选择的是Frameworks,而不是Resources或其他选项。同时不要勾选Copy only when installing——这个选项会导致调试时依赖框架不会被复制到主框架内,直接引发找不到库的崩溃。修正主框架与依赖框架的安装路径
在主框架的Build Settings里,找到INSTALL_PATH(安装路径),设置为@rpath;然后打开依赖框架的Build Settings,把它的INSTALL_PATH设置为@rpath/Frameworks/。这样主框架在加载时,动态链接器会从自身路径下的Frameworks文件夹里寻找依赖。配置Runpath搜索路径
分别检查主框架和App的Runpath Search Paths(Build Settings):- 主框架的搜索路径要添加
@loader_path/Frameworks——@loader_path指的是主框架自身的路径,这样能定位到内部的依赖框架。 - App的搜索路径要保留默认的
@executable_path/Frameworks,确保能找到嵌入的主框架。
- 主框架的搜索路径要添加
确保App正确嵌入主框架
不要只在App的Linked Frameworks and Libraries里添加主框架,一定要把主框架拖到App的Embed Frameworks阶段里。这一步会确保主框架(包括其内部的依赖框架)被正确复制到App的包内,并且完成签名。检查签名与Swift库配置
如果你的依赖框架是用Swift编写的,不管主框架是Swift还是OC,都要把主框架和App的Always Embed Swift Standard Libraries设置为YES。另外,主框架和依赖框架都要用相同的签名身份(比如Apple Development),避免签名不匹配导致的加载失败。清理缓存后重建
先执行Cmd+Shift+K清理项目,再删除Xcode的Derived Data(路径可以在Xcode偏好设置→Locations里找到),最后重新构建主框架和App。缓存残留经常会导致配置不生效的问题。查看更详细的崩溃日志
你现在看到的是dyld的底层崩溃栈,建议去Xcode的Organizer→Crashes里查看完整日志,或者运行App时观察控制台输出——dyld通常会明确打印出“Library not loaded: xxx”的具体信息,能帮你快速定位到底是哪个依赖找不到,或者路径配置错在哪里。
内容的提问来源于stack exchange,提问作者Damian Dudycz

