带有框架的iOS应用程序在设备上崩溃,dyld:未加载库,Xcode 6 Beta

vla*_*f81 551 crash dyld ios swift xcode6

这次崩溃是一个阻塞问题,基本上我使用以下步骤来重现问题:

  • 创建一个Cocoa Touch Framework项目
  • 添加一个swift文件和一个类Dog
  • 构建设备框架
  • 在Swift中创建单视图应用程序
  • 将框架导入到app项目中
  • 从ViewController中的框架实例化swift类
  • 在设备上构建并运行应用程序

应用程序在启动时立即崩溃,这是控制台日志:

dyld: Library not loaded: @rpath/FrameworkTest03.framework/FrameworkTest03
  Referenced from: /var/mobile/Applications/FA6BAAC8-1AAD-49B4-8326-F30F66458CB6/FrameworkTest03App.app/FrameworkTest03App
  Reason: image not found
Run Code Online (Sandbox Code Playgroud)

我试图在iOS 7.1和8.0设备上构建,它们都有相同的崩溃.但是我可以构建应用程序并在模拟器上运行良好.另外我知道我可以在Link Binary With Libraries中将框架从Required更改为Optional,但它没有完全解决问题,当我创建Dog实例时应用程序崩溃了.在设备和模拟器上的行为是不同的,我怀疑我们不能使用测试版的Xcode分发设备框架.任何人都可以阐明这一点吗?

vla*_*f81 953

在目标的" 常规"选项卡中,有一个" 嵌入二进制文件"字段.当您添加框架时,崩溃就会得到解决.

参考是这里的苹果开发者论坛.

  • 我在嵌入式二进制文件中有框架,我将复制阶段设置为"框架".无论如何它都会崩溃. (64认同)
  • 任何人都可以帮助如何在POD中添加嵌入式二进制文件框架? (14认同)
  • 将@ executable_path/Frameworks添加到'Runpath Search Path'解决了这个问题,即除了将框架添加到'Embedded Binaries'之外 (12认同)
  • 这只能在调试模式下解决.归档或构建项目时,将再次出现错误 (10认同)
  • 同上.我也想知道如何从POD添加,因为在XCode 6.4中没有使用PODS找到"General> Embedded Binaries" (3认同)
  • 我已经在嵌入式二进制文件部分添加了框架,但是如果允许应用程序在iOS 9.1的设备上运行,则应用程序仍然会在控制台中显示消息"dyld:库未加载:原因:图像未找到"随着应用程序在模拟器上顺利运行. (3认同)
  • 您必须在“框架、库和嵌入式内容”中为您的共享代码框架设置“嵌入和签名” (3认同)
  • 不,由于某种原因导致代码签名问题. (2认同)
  • 我在这篇 SO 帖子 (http://stackoverflow.com/questions/26104975/dyld-library-not-loaded-rpath-libswiftcore-dylib-image-not-found) 上发现对我有用。这是通过将字符串@executable_path/Frameworks 添加到运行路径搜索路径。执行此操作后,错误停止出现。 (2认同)
  • 这个答案已经过时了 (2认同)
  • 正如 @luckyhandler 所写,在 Xcode 11 及更高版本上,“链接的框架和库”和“嵌入式二进制文件”列表被组合成一个名为“框架、库和嵌入式内容”的列表。在那里,您应该在列表中找到您的 .framework,然后更改为“嵌入并签名” (2认同)

Daw*_*son 251

对于大于或等于8的iOS

在目标的"常规"选项卡下,在"嵌入式​​二进制文件"部分中添加框架.这会将框架复制到已编译的框架中,以便在运行时链接到该框架.

在此输入图像描述

为什么会这样?:因为您链接到的框架被编译为动态链接框架,因此在运行时链接到.

注意:仅在iOS> 8中支持嵌入自定义框架,因此可以使用适用于旧版iOS的替代解决方案.

对于iOS小于8

如果您对此框架有影响(可以访问源代码/构建过程),您可以将此框架更改为静态链接而不是动态链接.这将导致代码包含在已编译的应用程序中,而不是在运行时链接到,因此框架不必嵌入.

方法:在框架的Build Setting选项卡下,在Linking部分中将Mach-O Type更改为Static Library.您现在不需要在嵌入式二进制文件下包含该框架.

静态框架

包括资产:要包含诸如图像,音频或xib/nib文件之类的东西,我建议创建一个包(本质上是一个目录,这里有更多信息bit.ly/ios_bundle),然后使用NSBundle从包中加载资产.

  • 这应该是"大于或等于8".我也必须在iOS 8上这样做. (2认同)

Bra*_*n A 114

只需将框架拖入项目就不够好了.这就像在同一个球场,但无法找到你的孩子.跟着这些步骤:

1)创建您的框架

  • 开发您的框架.
  • 开发完成后,COMMAND+ B构建您的框架并确保您收到"Build Succeeded".

在此输入图像描述

2)访问您的框架

  • 一旦您的框架项目成功构建,它就可以让您Products在项目的文件夹中进行访问.

在此输入图像描述

  • 右键单击您的.framework并选择"在Finder中显示".

在此输入图像描述

3)在您的项目中放置框架

  • .frameworkFinder窗口拖放到应用项目的"Framework"文件夹中.

在此输入图像描述

4)为框架配置app项目

  • 选择项目中的顶级

在此输入图像描述

  • 选择你的目标

在此输入图像描述

  • 转到"Build Phases",然后"Link Binary with Libraries",并确保您的框架包含在可选的选项中.

在此输入图像描述

  • 仍在"构建阶段"中,转到左上角并选择+按钮.在下拉列表中选择"新建复制文件阶段".

在此输入图像描述

  • 向下滚动到新的"复制文件"部分,并确保设置Destination为"框架".将子路径留空.然后单击左下角的+按钮.

在此输入图像描述

  • 您将看到项目层次结构.向下滚动到在步骤3中添加框架的"Frameworks"文件夹,或在顶部的搜索栏中搜索它.选择您的框架,然后单击"添加".

在此输入图像描述

  • 确保您的框架包含在"复制代码签名"中.

在此输入图像描述

5)清洁,然后运行您的项目

  • COMMAND+ SHIFT+K
  • COMMAND+R

  • 好点子.它几乎适合我.我制作了一个框架A,其中包括Alamofire.我的主机App(嵌入式框架A)在模拟器中工作.但是当我尝试在真正的iPhone中运行它时,它会因错误而崩溃:Alamofire:dyld:未加载库:@ rpath/Alamofire.framework/Alamofire原因:找不到合适的图像.找到:xxx/ddcdemo.app/Frameworks/iddc.framework/Frameworks/Alamofire.framework/Alamofire:mach-o,但错误的架构 (5认同)
  • 谢谢!在您的步骤5中,我选中了“仅在安装时复制”,这就是我的问题。 (2认同)

Des*_*ose 47

首先尝试在Command + Option + Shift + K之后构建.如果仍然失败则执行以下步骤.

如果有人在Xcode 8中遇到此错误,则在目标的"常规"选项卡下将框架状态更改为" 可选"而不是"必需".

在此输入图像描述

  • 这将使运行时无法识别框架中的类 (3认同)

Nev*_*ess 45

我使用Swift3/Xcode 8.1创建了一个框架,并在Objective-C/Xcode 8.1项目中使用它.要解决此问题,我必须在下面启用Always Embed Swift Standard Libraries选项Build Options.

看看这个截图:

在此输入图像描述

希望有所帮助!

  • 这对我来说现在起作用了.解决这个问题的方法是转到BuildPhases - > Copy Files - >选择Destination下的Framework并添加你的框架.有可能你的图书馆遗失在这里. (3认同)

jfa*_*jay 27

我在iOS 9.x版本中遇到了同样的问题

ISSUE IS: App crashes as soon as I open the app with below error.

dyld: Library not loaded: /System/Library/Frameworks/UserNotifications.framework/UserNotifications Referenced from: /var/containers/Bundle/Application/######/TestApp.app/TestApp Reason: image not found

我已经改变解决了这个问题Required,以OptionalLinked Frameworks and LibrariesUserNotifications.framework框架.

  • 因为UserNotifications框架需要iOS10 (2认同)

lia*_*ols 25

您需要将框架添加到新的复制文件构建阶段,以确保在运行时将框架复制到应用程序包中.

有关详细信息,请参阅如何向我的目标添加"复制文件构建阶段".

官方Apple文档:https://developer.apple.com/library/mac/recipes/xcode_help-project_editor/Articles/CreatingaCopyFilesBuildPhase.html


Avi*_*oss 25

我不得不(在此处提到的内容)将以下行添加到Build Settings选项卡下的Runpath搜索路径:
@executable_path/Frameworks

在此输入图像描述


yoA*_*ex5 15

这是由以下原因引起的运行时错误 Dynamic Linker

dyld: Library not loaded: @rpath/<some_path>
Referenced from: <some_path>
Reason: image not found
Run Code Online (Sandbox Code Playgroud)

该错误Library not loaded@rpath指示Dynamic Linker无法找到二进制。

  1. 检查动态框架是否已添加到前端目标General -> Frameworks, Libraries, and Embedded Content (Embedded Binaries)。拖放框架以使用Copy items if needed[About]进行项目非常简单,并且错过了将框架添加为隐式依赖项
    Frameworks, Libraries, and Embedded Content(或检入Add to targets)。在这种情况下,在编译时 Xcode 将其构建为成功,但是当您运行它时会出现运行时错误

  2. 检查@rpath消费者(应用程序)和生产者(动态框架)之间的设置:

  • 动态框架:
    • Build Settings -> Dynamic Library Install Name
  • 应用:
    • Build Settings -> Runpath Search Paths
    • Build Phases -> Embed Frameworks -> Destination, Subpath
  1. 框架的Mach-O file[关于] - 动态库和应用程序的Frameworks, Libraries, and Embedded Content[关于] - 不嵌入。

动态链接器

Dynamic Library Install Name(LD_DYLIB_INSTALL_NAME)loadable bundleDynamic framework作为衍生)使用,其中dyld发挥作用
Dynamic Library Install Name- 二进制文件的路径(不是 .framework)。是的,它们具有相同的名称,但是MyFramework.framework是一个packaged bundle包含MyFramework二进制文件和资源的文件。
此目录路径可以是绝对的或相对的(例如@executable_path@loader_path@rpath)。相对路径更可取,因为它与锚点一起更改,当您将包作为单个目录分发时,该锚点很有用

绝对路径- Framework1示例

dyld: Library not loaded: @rpath/<some_path>
Referenced from: <some_path>
Reason: image not found
Run Code Online (Sandbox Code Playgroud)

Relative path 允许您以动态方式定义路径。

@executable_path

@executable_path - 相对于加载框架 用例的可执行二进制文件
Dynamic frameworkinside Application(应用程序二进制路径是@executable_path)或更复杂的例子App Extension[About]Containing Appwith Dynamic Frameworkinside的一部分。有2@executable_pathApplication目标(应用二进制路径是@executable_path)和App Extension目标(应用信息二进制路径是@executable_path)) - Framework2示例

//Framework1 Dynamic Library Install Name
/some_path/Framework1.framework/subfolder1
Run Code Online (Sandbox Code Playgroud)

@loader_path

@loader_path - 相对于导致加载框架的包。如果它是一个应用程序,那么它将与@executable_path
用例相同:具有嵌入式框架的框架 - Framework3_1 with Framework3_2 inside

//Application bundle(`.app` package) absolute path
/some_path/Application.?pp

//Application binary absolute path 
/some_path/Application.?pp/subfolder1

//Framework2 binary absolute path
/some_path/Application.?pp/Frameworks/Framework2.framework/subfolder1

//Framework2 @executable_path == Application binary absolute path <-
/some_path/Application.?pp/subfolder1

//Framework2 Dynamic Library Install Name 
@executable_path/../Frameworks/Framework2.framework/subfolder1

//Framework2 binary resolved absolute path by dyld
/some_path/Application.?pp/subfolder1/../Frameworks/Framework2.framework/subfolder1
/some_path/Application.?pp/Frameworks/Framework2.framework/subfolder1
Run Code Online (Sandbox Code Playgroud)

@rpath - 运行路径搜索路径

Framework2示例

以前我们必须设置一个框架来使用 dyld。不方便,因为同一个框架不能用于不同的配置。由于此设置是在 Framework 目标端进行的,因此无法为不同的使用者(应用程序)配置相同的框架

@rpath 是一个依赖于外部(应用程序)和嵌套(动态框架)部分的复合概念:

  • 应用:

    • Runpath Search Paths(LD_RUNPATH_SEARCH_PATHS)- @rpath- 定义将被替换的模板列表@rpath。消费者使用@rpath词指向此列表

      //Framework3_1 binary absolute path
      /some_path/Application.?pp/Frameworks/Framework3_1.framework/subfolder1
      
      //Framework3_2 binary absolute path
      /some_path/Application.?pp/Frameworks/Framework3_1.framework/Frameworks/Framework3_2.framework/subfolder1
      
      //Framework3_1 @executable_path == Application binary absolute path <-
      /some_path/Application.?pp/subfolder1
      
      //Framework3_1 @loader_path == Framework3_1 @executable_path <-
      /some_path/Application.?pp/subfolder1
      
      //Framework3_2 @executable_path == Application binary absolute path <-
      /some_path/Application.?pp/subfolder1
      
      //Framework3_2 @loader_path == Framework3_1 binary absolute path <-
      /some_path/Application.?pp/Frameworks/Framework3_1.framework/subfolder1
      
      //Framework3_2 Dynamic Library Install Name 
      @loader_path/../Frameworks/Framework3_2.framework/subfolder1
      
      //Framework3_2 binary resolved absolute path by dyld
      /some_path/Application.?pp/Frameworks/Framework3_1.framework/subfolder1/../Frameworks/Framework3_2.framework/subfolder1
      /some_path/Application.?pp/Frameworks/Framework3_1.framework/Frameworks/Framework3_2.framework/subfolder1
      
      Run Code Online (Sandbox Code Playgroud)
    • 检查Build Phases -> Embed Frameworks -> Destination, Subpath以确保嵌入框架的确切位置

  • 动态框架:

@rpath/Framework2.framework/subfolder1
Run Code Online (Sandbox Code Playgroud)

* ../- 转到当前目录的父目录

otool - 目标文件显示工具

//Application Runpath Search Paths
@executable_path/../Frameworks

//Framework2 Dynamic Library Install Name
@rpath/Framework2.framework/subfolder1

//Framework2 binary resolved absolute path by dyld
//Framework2 @rpath is replaced by each element of Application Runpath Search Paths
@executable_path/../Frameworks/Framework2.framework/subfolder1
/some_path/Application.?pp/Frameworks/Framework2.framework/subfolder1
Run Code Online (Sandbox Code Playgroud)

install_name_tool 使用更改动态共享库安装名称 -rpath

CocoaPods使用use_frameworks![About]来规范一个Dynamic Linker

[词汇]

[Java 类加载器]


Vin*_* TP 13

在嵌入式二进制文件中添加框架 在此输入图像描述

然后清理并构建.


小智 10

最近在旧款 iphone(例如 iPhone 6)和 Xcode(11.3.1)上导入 CoreNFC 时遇到了这个问题。我能够让它工作

  1. 在您的项目中,选择目标。
  2. 转到顶部的常规选项卡。
  3. 在“框架、库和嵌入式内容”部分下,添加框架(对我来说是 CoreNFC)。重复其他目标。
  4. 单击顶部的Build Phases并展开“ Link Binary with Libraries ”。
  5. 使麻烦的框架成为可选的(从必需的)。

这使我可以在不更改任何代码的情况下为较旧/较新的 iPhone 进行编译。我希望这对其他人有帮助。


And*_*nza 9

在我的例子中,解决方案是从嵌入式二进制文件中删除已编译的框架,嵌入式二进制文件是工作区中的独立项目,清理并重建它,最后重新添加到嵌入式二进制文件.


NYC*_*eer 8

如果您使用的是第三方框架,并使用Cocoapods作为依赖管理器,请尝试执行a pod install刷新您的pod.

这个崩溃发生在我使用的第三方库上,很高兴上述解决方案对我有用,希望它适合你!


Bas*_*Zen 8

令人惊讶的是,并非所有必要的部分都记录在这里,至少对于Xcode 8而言.

我的案例是一个定制的框架作为同一工作区的一部分.事实证明它正在被错误地构建.基于jeremyhu对此主题的最后回应:

https://forums.developer.apple.com/thread/4687

我不得不在框架下设置Dynamic Library Install Name Base(DYLIB_INSTALL_NAME_BASE)然后重建它.它被错误地设置为,我不得不将其更改为.Build Settings$(LOCAL_LIBRARY_DIR)@rpath

所以在链接处理阶段,它指示主机App在运行时从/Library/Frameworks/fw.Framework/fw(如文件系统的根目录)而不是路径到应用程序动态加载它/Frameworks/fw.Framework/fw

对于所有其他设置:它确实必须在3个地方Build Phases,但这些均一次设置时,你只是把它添加到Embedded Binaries了设定General的托管应用程序的选项卡.

我也没有必须建立一个额外的Copy Files阶段,这似乎对于嵌入阶段直观冗余反正.通过检查构建记录的尾部,我们可以确保这不是必需的.

PBXCp /Users/xyz/Library/Developer/Xcode/DerivedData/MyApp-cbcnqafhywqkjufwsvbzckecmjjs/Build/Products/Debug-iphoneos/MyFramework.framework
Run Code Online (Sandbox Code Playgroud)

[删除了许多冗长的行,但从Xcode UI中的简化记录中可以清楚地看到.]

我仍然知道为什么Xcode会DYLIB_INSTALL_NAME_BASE错误地设置我的值.


Jim*_*ota 7

我的环境:Cocos2d 2.0,Box2d,Objective C

除了做上面的其他答案,我终于进入了General选项卡并使WatchKit可选.

目标常规链接框架和库Watchkit.framework可选


Sho*_*hin 7

在此处输入图片说明

通过在构建阶段->嵌入式框架上取消选择“仅在安装时复制”来为我解决


Tam*_*gel 7

如果您使用的是Xcode 11或更高版本

  1. 导航到目标的设置,然后选择“ 常规”

目标设置/常规

  1. 向下滚动到Frameworks,Libraries和Embedded Content

  2. 如果需要,请确保为“ 嵌入”选项选择了“ 嵌入并签名”或“ 没有签名的嵌入”值。

框架,库和嵌入式内容部分


hen*_*dmg 5

我遇到过同样的问题.我尝试使用之前从未使用过的iPhone构建我的项目,但我没有添加新的框架.对我来说,清理工作正常(Shift + Command + K).也许是因为我使用了Xcode 7的beta 5和iOS 9 Beta的iPhone 6,但它确实有效.


Sté*_*uca 5

对于 Xcode 中使用 pod 的任何项目或框架项目,避免动态库 (dylb) 不加载的一种简单方法是将 pod 文件设置为静态模式下的墨迹。为此,请确保不要在 pod 文件中写入以下行。

use_frameworks!
Run Code Online (Sandbox Code Playgroud)

从您保存的文件中删除该行后,只需从控制台运行:

$ pod update
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

237336 次

最近记录:

5 年,9 月 前