我正在尝试创建一个基本的 OS X 框架,现在我只创建了一个测试框架:TestMacFramework.framework
,我正在尝试将它导入到一个全新的 OS X 应用程序项目中。
我已经构建了 .framework 文件并将其导入到新项目中,框架似乎链接正常,我可以引用我添加到框架构建阶段部分的公共头文件。
但是,当我尝试运行容器应用程序时,出现以下错误:
dyld: Library not loaded: /Library/Frameworks/TestMacFramework.framework/Versions/A/TestMacFramework
Referenced from: /Users/samharman/Library/Developer/Xcode/DerivedData/TestMacContainer-dzabuelobzfknafuhmgooqhqrgzl/Build/Products/Debug/TestMacContainer.app/Contents/MacOS/TestMacContainer
Reason: image not found
经过一番谷歌搜索后,我意识到我需要在我的容器应用程序构建阶段添加一个 Copy Files
部分,所以我已经完成了这个并像这样设置它......
https://i.stack.imgur.com/CmGGY.png
但是,我仍然收到运行时错误。我显然在这里做错了,但苹果开发人员库资源为此引用了 Xcode 2,所以不是很有帮助!
我错过了什么?
更新:
我可以在构建日志中看到我的 TestMacFramework.framework
被复制到 .app contents/frameworks 目录中,但它没有安装到 HD 上的 Library/Frameworks 目录中
https://i.stack.imgur.com/KuVbd.png
更新 2:
如果我手动将 TestMacFramework.framework
复制到 Library/Frameworks
目录,则构建链接正确
otool -L
告诉您应用程序希望在哪里找到框架?
/Library/Frameworks/TestMacFramework.framework/Versions/A/TestMacFramework (compatibility version 1.0.0, current version 1.0.0)
[Xcode 11+]
唯一要做的就是将框架添加到应用目标的 General
选项卡中的 General->Frameworks, Libraries And Embedded Content
部分。
确保选择“嵌入并签名”选项。
https://i.stack.imgur.com/ZuCyy.png
[Xcode v6 -> Xcode v10]
唯一要做的就是将框架添加到应用目标的 General
选项卡中的 Embedded binaries
部分。
https://i.stack.imgur.com/T4g6I.png
所以我设法让它工作,当你有正确的指示时它很简单。我正在寻找的是一个“私有”框架,它存在于 App 包中,而不是被写入系统库文件夹。
构建框架
添加一个目标以创建一个 Cocoa 框架 在该目标中“构建设置”将“安装目录”配置为“@executable_path/../Frameworks”构建库,并从存档或产品目录访问 .framework
包括框架
将创建的 .framework 文件拖到 Xcode 项目中,一定要勾选 'Copy Files to Directory' 在包含的应用程序目标中,添加一个新的 'Copy File Build Phase' 将 'Destination' 设置为 'Frameworks' 在创建的 .框架
这对我来说很简单,我只是将我的框架添加到应用程序目标下的嵌入式二进制文件中
上面的选项我不可能包括在内。我通过指定运行路径搜索路径解决了它
它位于“构建设置”标签上。在“链接”部分。将“Runpath Search Paths”更改为 $(inherited) @executable_path/Frameworks
我遇到了同样的问题,但接受的解决方案对我不起作用。相反,解决方案是修改框架的安装名称。
原帖中的错误是:
dyld: Library not loaded: /Library/Frameworks/TestMacFramework.framework/Versions/A/TestMacFramework
Referenced from: /Users/samharman/Library/Developer/Xcode/DerivedData/TestMacContainer-dzabuelobzfknafuhmgooqhqrgzl/Build/Products/Debug/TestMacContainer.app/Contents/MacOS/TestMacContainer
Reason: image not found
注意库未加载后的第一个路径。正在从绝对路径加载框架。此路径来自框架的安装名称(有时称为 rpath),可以使用以下命令进行检查:
otool -D MyFramework.framework/MyFramework
当框架嵌入到应用程序中时,此路径应该是相对的并且具有以下形式:@rpath/MyFramework.framework/MyFramework。如果您的框架的安装名称是绝对路径,则它可能不会在运行时加载,并且会产生类似于上述错误的错误。
解决方法是修改安装名称:
install_name_tool -id "@rpath/MyFramework.framework/MyFramework" MyFramework.framework/MyFramework
通过此更改,我不再收到错误消息
删除派生数据为我保存了它
pod install
时它起作用了。
这些问题都没有为我解决这个问题。最后的问题很简单。看起来它是一个非常重要的 Xcode 错误,我已经记录了这个问题并在 Apple 错误下修复:29820370。如果你正在苦苦挣扎(因为似乎有几页类似的问题),那么如果你能在错误报告器上提出错误:https://bugreport.apple.com/ 并参考我提出的错误以获得可见性。我想让 Xcode 恢复到以前的乐趣——这是我确信 Xcode 应该自己解决的问题。
解决方法如下: 1. 打开钥匙串 - 转到 Apple Worldwide Developer Cert。 2. 双击它 3. 将权限级别从“始终信任”更改为使用系统默认值 4. 保存并关闭它 5. 重新启动 Xcode,清理并构建您的项目,它应该消失了。
https://i.stack.imgur.com/TemNv.jpg
当您将自定义框架拖入 Xcode 10.1 下的项目时,它假定该框架是一个系统框架,并将该框架放入您的目标下“Build Phases”的“Link Binary With Libraries”部分。
系统框架已经在设备上,因此它不会被复制到设备上,因此无法在运行时执行,所以 KABOOM(在 __abort_with_payload 中崩溃,并告知错误:“原因:找不到图像”)。这是因为框架代码没有复制到设备上...
实际上,要让 Xcode 链接自定义框架并确保将其与您的代码一起复制到 iOS 设备(真实或模拟器),需要将自定义框架移动到“复制捆绑资源”。这最终将框架与您的可执行代码一起打包,以便在设备上一起使用。
将自定义框架添加到项目并避免 Apple 崩溃:
将自定义框架拖到您的 iOS 项目文件列表中单击导航器中的项目名称 -> 目标名称 -> “构建阶段” -> 将二进制文件与库链接显示三角形 将自定义框架向下拖动到下面的“复制捆绑资源”部分(Xcode 现在移动框架参考,在 Xcode 10 中修复)在模拟器或设备中运行
因此,自定义框架与您的代码一起复制到您的目标设备,并在运行时可用。
https://i.stack.imgur.com/yMVOc.jpg
[社论:你会认为 Xcode 足够聪明,可以找出其中一个不需要复制到设备的系统框架和一个自定义框架之间的区别,哦,我不知道,在项目根目录层次结构中...🙄]
Xcode 11:
在 Xcode 11 中将框架添加到 General->Frameworks, Libraries And Embedded Content
添加后确保选择 Embed & Sign
选项
https://i.stack.imgur.com/fMXk0.png
在“构建阶段”中应该有一个“运行脚本”:“/usr/local/bin/carthage copy-frameworks”
在该“运行脚本”的“输入文件”上,您应该将路径添加到您的库。像这样:
https://i.stack.imgur.com/Gh9jU.png
如果您不小心重置了钥匙串,这可能是因为钥匙串中缺少 Apple 证书。我按照 this 解决了我的问题。
我遇到了同样的问题,并且能够通过重新下载 WWDR(Apple 全球开发者关系认证机构)来解决。从这里下载:http://developer.apple.com/certificationauthority/AppleWWDRCA.cer
如果您使用的是 Xcode 11,请确保在 Target settings - General 下的 Frameworks、Libraries 和 Embed Content 中添加了框架。将嵌入状态从“不嵌入”更改为“嵌入并签名”
为我解决的问题是将 Podfile 中主要目标的 abstract_target
更改为 target
。我之前已将其设置为 abstract_target
,这导致了所描述的错误。现在它就像一个魅力
对于 Xcode 8,一些过时的产品将从派生数据文件夹中删除,请参阅 this solution。
根据作者的想法,我从我的案例中找到了这个构建日志。
Remove stale build products
/bin/rm -rf /Users/usename/Library/Developer/Xcode/DerivedData/myapp-esvvhwwwwngijeemhatmklwzoxnb/Build/Products/Debug-iphonesimulator/myapp.app/Frameworks/AliyunVodPlayerSDK.framework
/bin/rmdir /Users/usename/Library/Developer/Xcode/DerivedData/myapp-esvvhwwwwngijeemhatmklwzoxnb/Build/Products/Debug-iphonesimulator/myapp.app/Frameworks
在创建新的副本文件阶段并将目标陈旧框架复制到 Frameworks 目的地后,上述删除日志在重建后消失。
只是澄清我的情况和原因,希望它对某人有所帮助。
对我来说,经过数小时的搜索,这就是解决方案!
出于某种原因,在 Swift 2.3 自定义框架的开发过程中,Xcode 8 已经从 project.pbxproj
文件中删除了 DYLIB_INSTALL_NAME_BASE
设置。走进 Build Settings / Dynamic Library Install Name Base
设置回到 @rpath
修复它。
(来自 https://forums.developer.apple.com/thread/4687)
我在使用 UniformTypeIdentifiers.framework 的 Xcode 13 beta 时遇到了这个问题。该应用程序无法在低于 13 的 iOS 版本上运行。以下方法解决了该问题:
https://i.stack.imgur.com/ZoT3P.png
我发现此问题仅与代码签名和证书有关,与代码本身无关。要验证这一点,请创建基本的单视图应用程序并尝试在不对您的设备进行任何更改的情况下运行它。如果您看到相同的错误类型,则表明您的代码很好。像我一样你会发现你的证书是无效的。再次下载并修复所有过期的。然后,当您让基本应用程序不报告错误时,请在退出 Xcode 并重新启动您的 Mac 后再次尝试您的应用程序。终于结束了这场噩梦。这很可能与您的代码无关,尤其是当您尝试运行它时收到“构建成功”消息时。供参考
在尝试 Xcode 9 beta 并返回 Xcode 8 时遇到问题。目标上的简单清理解决了该问题。
由于不同的原因,我遇到了同样的问题。我已经为调试和发布创建了一个新配置(在项目 -> 信息选项卡 -> 配置下)。而且我必须更改我的 pod 框架 shell 脚本(Pods-"appName"-frameworks.sh ,在 Targets Support Files 下)才能使其正常工作。
[Xcode 9]
唯一对我有用的东西:
Target > Build Phases > [CP] Embed Pods Frameworks 取消选中“在构建日志中显示环境变量”和“仅在安装时运行脚本”
我尝试了许多修复,但对我有用的是删除构建方案的构建选项卡中列出的缺失目标。您可以通过打开当前方案的编辑窗口来访问它。
编辑:我的 UI 测试目标不能正常工作,我找到的解决方案是删除它并重新生成它。
打开 xcode -> 常规 -> Embedded Binaries -> 添加 QBImagepicker.framework 和 RSKImageCropper -> 清理项目
只需在为我工作的嵌入式二进制文件中添加 QBImagePicker.framework 和 RSKImageCropper.framework
我认为没有固定的方法来解决这个问题,因为它可能是由不同的原因引起的。上周我也遇到了这个问题,不知道是什么时候出现这个问题,具体是什么原因导致的,只有当我用Xcode在模拟器上运行或者尝试安装到手机上时,才会报这样的错误,但是当我用终端的 react-native run-ios 运行它,没有问题。
我检查了互联网上发布的所有方式,例如更新证书,更改 Xcode 中的设置(上面提到的所有方式),实际上 Xcode 中的所有设置都已经按照之前的要求进行了设置,没有一种方式适合我。直到今天早上我删除 pod 并重新安装时,错误终于在一周后消失了。如果你也在使用 cocoapod,然后错误只是出现而没有任何具体原因,也许你可以试试我的方法。
检查我的 cocoapods 版本。如果有新版本可用,请更新它。转到您的项目文件夹,删除您的 Podfile.lock 、Pods 文件、项目 xcworkspace。运行 pod 安装
我只有在真实设备(iPhone SE)上运行时才遇到这个问题。在模拟器项目上按预期工作。
我确实从这个线程和 here 尝试了所有修复。这些都不适合我。
对我来说,重启 iPhone 后问题就解决了(原文如此!)。
我做了:
清理构建文件夹,
清洁派生数据,
从设备中删除应用程序,
重启设备
它终于奏效了。 :)
如果所有其他解决方案都失败了,请不要忘记尝试一下。
Xcode 11:构建阶段-> 嵌入框架
https://i.stack.imgur.com/wV7HJ.png
Pod Frameworks
可能会发生这种情况。我在使用 AnswerBotProvidersSDK.framework
时遇到了同样的问题,我的错误是,我在目标构建阶段设置了 Run Script 检查 Install builds only。
不正确的设置:
https://i.stack.imgur.com/xdYre.png
正确设置:
https://i.stack.imgur.com/PYC8s.png
对我来说,出于某种原因,xCode(到目前为止是 12.5)决定我的通知服务扩展目标不应该有正确的框架路径。我怀疑这是在我从 xCode 12.1 更新到 12.5 之后发生的。
因此,我遇到了与我的一个内部框架相关的相同错误。要解决此问题,请执行以下操作:
转到项目的常规选项卡选择您的目标(在我的情况下它是通知服务扩展目标)确保框架和库部分包含您缺少的框架。我在我的 NSE 目标中留下了嵌入而不签名,但它也通过嵌入和签名添加到我的主要应用程序目标保持选中目标并切换到构建设置选项卡在搜索栏中输入 LD_RUNPATH_SEARCH_PATHS(确保所有将显示可能的设置,而不仅仅是基本)您将看到运行路径搜索路径,它对我来说是空的。在此处添加 3 个以下值: $(inherited) @executable_path/Frameworks @executable_path/../../Frameworks
这对我有帮助。
Embedded binaries
部分。怎么了?