vla*_*f81 551 crash dyld ios swift xcode6
这次崩溃是一个阻塞问题,基本上我使用以下步骤来重现问题:
应用程序在启动时立即崩溃,这是控制台日志:
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
在目标的" 常规"选项卡中,有一个" 嵌入二进制文件"字段.当您添加框架时,崩溃就会得到解决.
参考是这里的苹果开发者论坛.
Daw*_*son 251
在目标的"常规"选项卡下,在"嵌入式二进制文件"部分中添加框架.这会将框架复制到已编译的框架中,以便在运行时链接到该框架.
为什么会这样?:因为您链接到的框架被编译为动态链接框架,因此在运行时链接到.
注意:仅在iOS> 8中支持嵌入自定义框架,因此可以使用适用于旧版iOS的替代解决方案.
如果您对此框架有影响(可以访问源代码/构建过程),您可以将此框架更改为静态链接而不是动态链接.这将导致代码包含在已编译的应用程序中,而不是在运行时链接到,因此框架不必嵌入.
方法:在框架的Build Setting选项卡下,在Linking部分中将Mach-O Type更改为Static Library.您现在不需要在嵌入式二进制文件下包含该框架.
包括资产:要包含诸如图像,音频或xib/nib文件之类的东西,我建议创建一个包(本质上是一个目录,这里有更多信息bit.ly/ios_bundle),然后使用NSBundle从包中加载资产.
Bra*_*n A 114
只需将框架拖入项目就不够好了.这就像在同一个球场,但无法找到你的孩子.跟着这些步骤:
1)创建您的框架
COMMAND
+ B
构建您的框架并确保您收到"Build Succeeded".2)访问您的框架
Products
在项目的文件夹中进行访问..framework
并选择"在Finder中显示".3)在您的项目中放置框架
.framework
Finder窗口拖放到应用项目的"Framework"文件夹中.4)为框架配置app项目
+
按钮.在下拉列表中选择"新建复制文件阶段".Destination
为"框架".将子路径留空.然后单击左下角的+
按钮.5)清洁,然后运行您的项目
COMMAND
+ SHIFT
+K
COMMAND
+R
Des*_*ose 47
首先尝试在Command + Option + Shift + K之后构建.如果仍然失败则执行以下步骤.
如果有人在Xcode 8中遇到此错误,则在目标的"常规"选项卡下将框架状态更改为" 可选"而不是"必需".
Nev*_*ess 45
我使用Swift3/Xcode 8.1创建了一个框架,并在Objective-C/Xcode 8.1项目中使用它.要解决此问题,我必须在下面启用Always Embed Swift Standard Libraries
选项Build Options
.
看看这个截图:
希望有所帮助!
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
,以Optional
在Linked Frameworks and Libraries
为UserNotifications.framework
框架.
lia*_*ols 25
您需要将框架添加到新的复制文件构建阶段,以确保在运行时将框架复制到应用程序包中.
有关详细信息,请参阅如何向我的目标添加"复制文件构建阶段".
官方Apple文档:https://developer.apple.com/library/mac/recipes/xcode_help-project_editor/Articles/CreatingaCopyFilesBuildPhase.html
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
无法找到二进制。
检查动态框架是否已添加到前端目标General -> Frameworks, Libraries, and Embedded Content (Embedded Binaries)
。拖放框架以使用Copy items if needed
[About]进行项目非常简单,并且错过了将框架添加为隐式依赖项
Frameworks, Libraries, and Embedded Content
(或检入Add to targets
)。在这种情况下,在编译时 Xcode 将其构建为成功,但是当您运行它时会出现运行时错误
检查@rpath
消费者(应用程序)和生产者(动态框架)之间的设置:
Build Settings -> Dynamic Library Install Name
Build Settings -> Runpath Search Paths
Build Phases -> Embed Frameworks -> Destination, Subpath
动态链接器
Dynamic Library Install Name(LD_DYLIB_INSTALL_NAME)
由loadable bundle
(Dynamic 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 framework
inside Application
(应用程序二进制路径是@executable_path)或更复杂的例子App Extension
[About]是Containing App
with Dynamic Framework
inside的一部分。有2@executable_path
对Application
目标(应用二进制路径是@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)
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
以确保嵌入框架的确切位置
动态框架:
Dynamic Library Install Name(LD_DYLIB_INSTALL_NAME)
-@rpath
与本地包路径一起使用的指向二进制文件的点
@executable_path/../Frameworks
Run Code Online (Sandbox Code Playgroud)
@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
小智 10
最近在旧款 iphone(例如 iPhone 6)和 Xcode(11.3.1)上导入 CoreNFC 时遇到了这个问题。我能够让它工作
这使我可以在不更改任何代码的情况下为较旧/较新的 iPhone 进行编译。我希望这对其他人有帮助。
如果您使用的是第三方框架,并使用Cocoapods作为依赖管理器,请尝试执行a pod install
刷新您的pod.
这个崩溃发生在我使用的第三方库上,很高兴上述解决方案对我有用,希望它适合你!
令人惊讶的是,并非所有必要的部分都记录在这里,至少对于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
错误地设置我的值.
如果您使用的是Xcode 11或更高版本:
向下滚动到Frameworks,Libraries和Embedded Content。
如果需要,请确保为“ 嵌入”选项选择了“ 嵌入并签名”或“ 没有签名的嵌入”值。
我遇到过同样的问题.我尝试使用之前从未使用过的iPhone构建我的项目,但我没有添加新的框架.对我来说,清理工作正常(Shift + Command + K).也许是因为我使用了Xcode 7的beta 5和iOS 9 Beta的iPhone 6,但它确实有效.
对于 Xcode 中使用 pod 的任何项目或框架项目,避免动态库 (dylb) 不加载的一种简单方法是将 pod 文件设置为静态模式下的墨迹。为此,请确保不要在 pod 文件中写入以下行。
use_frameworks!
Run Code Online (Sandbox Code Playgroud)
从您保存的文件中删除该行后,只需从控制台运行:
$ pod update
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
237336 次 |
最近记录: |