OS X Framework Library未加载:'未找到图像'

时间:2014-07-28 10:56:57

标签: macos frameworks xcode5 dyld

我正在尝试创建一个基本的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部分,所以我已经完成了这个并将其设置为......

enter image description here

但是,我仍然遇到运行时错误。我显然在这里做错了,但Apple开发人员库资源引用了Xcode 2,所以不是很有帮助!

我错过了什么?

更新

我可以在构建日志中看到我的TestMacFramework.framework被复制到.app内容/框架目录中,但它没有被安装到HD上的Library / Frameworks目录

enter image description here

更新2:

如果我手动将TestMacFramework.framework复制到Library/Frameworks目录

,则构建链接正确

26 个答案:

答案 0 :(得分:474)

[来自Xcode 6 - > 7.3]

(是的,仍在使用Xcode 10,iOS和macOS)

唯一要做的就是将框架添加到应用目标的Embedded binaries标签中的General部分。

Screenshot from Xcode

答案 1 :(得分:54)

所以我设法让它工作,当你有正确的指示时,这很简单。我正在寻找的是一个“私有”框架,它存在于应用程序包中,而不是写入系统库文件夹。

构建框架

  1. 添加目标以创建Cocoa框架
  2. 在目标“构建设置”中,将“安装目录”配置为“@executable_path /../ Frameworks”
  3. 构建库,并从存档或产品目录访问.framework
  4. 包含框架

    1. 将创建的.framework文件拖到Xcode项目中,请务必选中“将文件复制到目录”
    2. 在包含应用程序目标中,添加新的“复制文件构建阶段”
    3. 将“目的地”设置为“框架”
    4. 拖动创建的.framework

答案 2 :(得分:18)

对我来说这很简单,我只是将我的框架添加到app目标下的嵌入式二进制文件

答案 3 :(得分:13)

上面的选项,我不能包括在内。 我通过指定Runpath搜索路径

解决了这个问题

这是在构建设置'标签。 在' 关联'部分。 更改' 运行路径搜索路径'进入$(inherited) @executable_path/Frameworks

答案 4 :(得分:7)

这些问题都没有为我解决这个问题。最终的问题很简单。看起来它是一个非常重要的Xcode错误,我已经记录了问题并修复了Apple错误:29820370。如果你正在努力(因为看起来有几页类似的问题),那么如果你能提出bug记者的错误:https://bugreport.apple.com/并引用我提出的错误以获得可见性。我想让Xcode恢复到以前的乐趣 - 这是我确信Xcode应该自行修复的东西。

以下是修复: 1.打开钥匙串 - 转到Apple Worldwide Developer Cert。 2.双击它 3.更改权限级别"始终信任"使用系统默认值 4.保存并关闭它 5.重新启动Xcode,清理并构建项目,它应该消失了。

以下正确设置的屏幕截图: Keychain access fixed 希望这可以帮助!

答案 5 :(得分:6)

删除派生数据为我保存了

答案 6 :(得分:6)

我遇到了同样的问题,但接受的解决方案对我不起作用。相反,解决方案是修改框架的安装名称。

原帖中的错误是:

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 

通过此更改,我不再收到错误

答案 7 :(得分:5)

  

Xcode 11:

在Xcode 11中将框架添加到General->Frameworks, Libraries And Embedded Content

添加后,请确保选择Embed & Sign选项

enter image description here

答案 8 :(得分:4)

应该有一个'运行脚本'进入'构建阶段'用这个:' / usr / local / bin / carthage copy-frameworks'

在'输入文件'在那个'运行脚本'中,你应该添加你的库的路径。像这样:

Build Phases Run Script

答案 9 :(得分:4)

如果您使用的是 Xcode 11 ,请确保已在“目标”设置-“常规”下的“框架”,“库”和“嵌入内容”中添加了框架。将嵌入状态从-“请勿嵌入” 更改为“嵌入并签名”

答案 10 :(得分:4)

当您将自定义框架拖到 Xcode 10.1 下的项目中时,它会假定该框架是系统框架,并将该框架放入“使用库链接二进制文件”目标下的“构建阶段”部分。

系统框架已经在设备上,因此无法将其复制到设备上,因此无法在运行时执行,因此KABOOM (__ abort_with_payload崩溃,并提示错误:“原因:未找到图像” )。这是因为框架代码未复制到设备中。

实际上,要让Xcode链接自定义框架并确保将其与您的代码一起复制到iOS设备(真实或模拟器),则需要将自定义框架移至“复制捆绑资源”。最终,该框架连同您的可执行代码一起打包在设备上。

要向项目中添加自定义框架并避免Apple崩溃:

  1. 将自定义框架拖到iOS项目文件列表中
  2. 在导航器中单击ProjectName-> TargetName->“构建阶段”-> 链接二进制与库公开三角形
  3. 将自定义框架拖放到下面的“复制捆绑资源”部分(Xcode现在移动框架参考,已在Xcode 10中修复)
  4. 在模拟器或设备中运行

因此,自定义框架将与您的代码一起复制到目标设备,并在运行时可用。

enter image description here

[编辑:您会认为 Xcode足够聪明,可以找出不需要复制到设备中的其中一个系统框架与一个自定义框架之间的区别,哦,我不知道不知道,在项目根目录层次中...]

答案 11 :(得分:3)

如果您不小心重置了钥匙串,可能会因钥匙串中缺少Apple证书而发生这种情况。我跟着this来解决我的问题。

我遇到了同样的问题,并且能够通过重新下载WWDR(Apple全球开发者关系认证机构)来解决问题。 从这里下载:http://developer.apple.com/certificationauthority/AppleWWDRCA.cer

答案 12 :(得分:1)

对我来说,经过几个小时的搜索后,这就是解决方案!!

出于某种原因,在开发Swift 2.3自定义框架时,Xcode 8已从DYLIB_INSTALL_NAME_BASE文件中删除了project.pbxproj设置。稍微走进Build Settings / Dynamic Library Install Name Base设置回@rpath修复它。

(来自https://forums.developer.apple.com/thread/4687

答案 13 :(得分:1)

对于Xcode 8,将从派生数据文件夹中删除一些陈旧产品,请参阅this solution

Apple:In macOS 10.12 and later, Xcode cleans up stale derived data, precompiled headers, and module caches. (23282174)

The Xcode build system supports stale file removal of some types of build artifacts that were produced in a previous build, but have since been removed from the project.

根据作者的想法,我从我的案例中找到了这个构建日志。

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 目标后,上述删除日志在重建后消失。

请澄清我的情况和理由,希望它对某人有帮助。

答案 14 :(得分:0)

出于不同的原因,我遇到了同样的问题。 我已经为Debug和Release创建了一个新配置(在PROJECT - > Info选项卡 - > Configuration下)。 我不得不更改我的pod框架shell脚本(Pods - " appName" -frameworks.sh,在Targets Support Files下)以使其工作。

[Xcode 9]

答案 15 :(得分:0)

唯一对我有用的事情是:

目标>构建阶段> [CP]嵌入Pods框架 取消选中“在构建日志中显示环境变量”和“仅在安装时运行脚本”

答案 16 :(得分:0)

我尝试了很多修复,但对我来说有用的是删除构建方案的构建选项卡中列出的缺失目标。您可以通过打开当前方案的编辑窗口来实现它。

编辑:我的UI测试目标效果不佳,我找到的解决方案是删除它并再次生成它。

答案 17 :(得分:0)

打开xcode - >一般 - >嵌入式二进制文件 - >添加QBImagepicker.framework和RSKImageCropper - >清洁项目

只需在为我工作的嵌入式二进制文件中添加QBImagePicker.framework和RSKImageCropper.framework

答案 18 :(得分:0)

为我解决的问题是将Podfile中主要目标的abstract_target更改为target。我之前将其设置为abstract_target,这导致了所描述的错误。现在它就像魅力一样

答案 19 :(得分:0)

我认为没有固定的方法可以解决此问题,因为它可能是由不同的原因引起的。上周我也遇到了这个问题,我不知道什么时候以及到底是什么原因导致了这个问题,只有当我使用Xcode在模拟器上运行它或尝试将其安装到手机上时,它才会报告这种错误,但是当我使用带有终端的react-native run-ios来运行它,没有问题。

我检查了所有发布在Internet上的方法,例如续订证书,更改Xcode中的设置(上述所有方法),实际上Xcode中的所有设置都已经按照之前的要求进行了设置,但对我而言,没有任何一种方法有效。直到今天早上,当我删除吊舱并重新安装时,一个星期后,错误终于出现了。如果您还使用cocoapod,而错误只是在没有任何特定原因的情况下出现,也许您可​​以尝试我的方式。

  1. 检查我的cocoapods版本。
  2. 如果有可用的新版本,请对其进行更新。
  3. 转到您的项目文件夹,删除Podfile.lock,Pods文件,项目xcworkspace。
  4. 运行pod install

答案 20 :(得分:0)

在尝试Xcode 9 beta并返回Xcode 8时出现问题。目标上的简单清理解决了这个问题。

答案 21 :(得分:0)

我发现此问题仅与代码签名和证书有关,而与代码本身无关。要验证这一点,请创建基本的单一视图应用,并尝试在不对设备进行任何更改的情况下运行它。如果您看到相同的错误类型,则表明您的代码没问题。像我一样,你会发现你的证书无效。再次下载并修复任何过期的。然后,当你得到基本的应用程序不报告错误时,请在退出Xcode后重新尝试你的应用程序,并可能重新启动你的mac。这终于让这场噩梦结束了。这很可能与您的代码无关,尤其是当您尝试运行它时获得Build Successful消息。 FYI

答案 22 :(得分:0)

仅在真实设备(iPhone SE)上运行时,我才遇到该问题。在模拟器上的项目按预期工作。

我确实尝试了该线程和here的所有修复程序。 这些都不对我有用。

对我来说,重新启动iPhone后就解决了问题(原文如此!)。

我做到了:

  • 清理构建文件夹,
  • 清除派生数据,
  • 从设备中删除应用,
  • 重新启动设备

终于可以了。 :)

如果其他所有解决方案均失败,请不要忘记尝试一下。

答案 23 :(得分:0)

Xcode 11: 构建阶段->嵌入框架

enter image description here

答案 24 :(得分:0)

Pod Frameworks可能会发生这种情况。 我在AnswerBotProvidersSDK.framework时遇到了同样的问题,我的错误是,我在目标构建阶段中设置了运行脚本以检查是否仅安装构建

不正确的设置:

enter image description here

正确的设置:

enter image description here

答案 25 :(得分:0)

出于某种原因,xCode(目前为 12.5)决定我的通知服务扩展目标不应该有正确的框架路径。我怀疑这是在我从 xCode 12.1 更新到 12.5 之后发生的。

所以我遇到了与我的一个内部框架相关的相同错误。要解决此问题,请执行以下操作:

  1. 转到项目的 General 标签

  2. 选择您的目标(在我的例子中是通知服务扩展目标)

  3. 确保 Framework and Libraries 部分包含您缺少的框架。我已将它 Embed Without Signing 留在我的 NSE 目标中,但它也与 Embed & Sign 添加到我的主要应用目标

  4. 保持选中目标并切换到 Build Settings 标签

  5. 在搜索栏中输入 LD_RUNPATH_SEARCH_PATHS(确保将显示 All 可能的设置,而不仅仅是 Basic

  6. 你会看到 Runpath Search Paths 对我来说它是空的。

  7. 在那里添加以下 3 个值:

    • $(继承)
    • @executable_path/Frameworks
    • @executable_path/../../Frameworks

这对我有帮助。