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

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

  • 创建一个Cocoa Touch框架项目
  • 添加一个swift文件和一个类
  • 为设备构建一个框架
  • 在Swift中创建一个单视图应用程序
  • 导入框架到应用程序项目
  • 从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

我尝试在iOS 7.1和8.0设备上构建,它们都有相同的崩溃。然而,我可以构建一个应用程序,并在模拟器上运行良好。此外,我知道我可以在用库链接二进制文件中改变框架以形成要求可选,但它没有完全解决问题,当我创建的实例时,应用程序崩溃了。在设备和模拟器上的行为是不同的,我怀疑我们不能使用测试版的Xcode为设备分发框架。有人能解释一下吗?

317742 次浏览

您需要将框架添加到一个新的Copy Files Build Phase,以确保框架在运行时被复制到应用程序包中。

有关更多信息,请参阅如何添加'复制文件构建阶段'致我的目标

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

在目标的一般选项卡中,有一个嵌入二进制文件字段。当你在那里添加框架时,崩溃就解决了。

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

对于大于或等于8的iOS

在目标的General选项卡下,在Embedded Binaries部分中添加框架。这将把框架复制到编译后的文件中,以便在运行时可以链接到它。

enter image description here

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

**注意:**嵌入自定义框架只支持在iOS > 8,因此一个替代解决方案,适用于旧版本的iOS如下。

对于小于8的iOS

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

**方法:**在框架的Build Setting选项卡下,在链接部分,将Mach-O类型更改为静态库。您现在不需要将框架包含在嵌入式二进制文件中。

静态框架

要包括图像、音频或xib/nib文件,我建议创建一个包(本质上是一个目录,更多信息在这里bit.ly/ios_bundle),然后使用NSBundle从包中加载资产。

我必须(在这里提到的内容之上)在建立设置选项卡下添加以下一行到跑道搜寻路径 # EYZ0 < / p >

enter image description here

我也有同样的问题。我试着用我从未使用过的iPhone来构建我的项目,我没有添加新的框架。对我来说,清理工作很好(Shift +命令+ K)。也许是因为我使用的是Xcode 7的beta 5和iPhone 6的iOS 9 beta,但它确实有效。

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

除了做上面的其他答案,我最后去了General选项卡,并使WatchKit可选。

Target General Linked Frameworks and Libraries Watchkit.framework Optional

如果有人仍然遇到这个问题,尽管遵循了许多其他答案中概述的所有步骤,你可能需要撤销重新创建代码签名证书,如下所示:

https://developer.apple.com/library/ios/qa/qa1886/_index.html

如果您正在使用第三方框架,并使用Cocoapods作为依赖管理器,请尝试使用pod install来刷新您的pod。

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

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

首先尝试在命令+选项+Shift+K后构建。如果仍然失败,然后执行以下步骤。

如果有人在Xcode 8中遇到这个错误,那么在目标的General标签下将框架状态改为可选而不是Required。

enter image description here

令人惊讶的是,这里并没有记录所有必要的部分,至少对于Xcode 8来说是这样。

我的案例是一个定制的框架,作为同一个工作空间的一部分。事实证明,它的建造是错误的。根据jeremyhu对这篇文章的最后回复:

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

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

因此,在应用程序项目的链接处理阶段,它指示主机应用程序在运行时从/Library/Frameworks/fw.Framework/fw(即运行时文件系统的根目录)动态加载框架,而不是path-to-App/Frameworks/fw.Framework/fw

关于所有其他设置:它必须在Build Phases的3个地方,但当你把它添加到主机应用的General选项卡的Embedded Binaries设置时,这些都是一次性设置的。

我确实必须设置一个额外的Copy Files阶段,这对于嵌入阶段来说似乎是多余的。通过检查构建记录的末尾,我们可以保证这是不必要的。

PBXCp /Users/xyz/Library/Developer/Xcode/DerivedData/MyApp-cbcnqafhywqkjufwsvbzckecmjjs/Build/Products/Debug-iphoneos/MyFramework.framework

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

我仍然有没有的想法,为什么Xcode设置DYLIB_INSTALL_NAME_BASE值不正确。

我在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框架。

我使用Swift3/Xcode 8.1创建了一个框架,并在Objective-C/Xcode 8.1项目中使用它。为了解决这个问题,我不得不在Build Options下启用Always Embed Swift Standard Libraries选项。

看看这张截图:

enter image description here

仅仅将框架拖到项目中是不够的。这就像是在同一个球场,却找不到自己的孩子。遵循以下步骤:

创建你的框架

  • 开发框架。
  • 一旦你的开发完成,COMMAND+B构建你的框架,并确保你收到“构建成功”。

enter image description here

访问你的框架

  • 一旦你的框架项目成功构建,你就可以在项目中的Products文件夹中访问它了。

enter image description here

  • 右键单击.framework,选择“显示在Finder中”。

enter image description here

在项目中放置框架

  • .framework从Finder窗口拖放到应用项目的“框架”文件夹中。

enter image description here

为框架配置应用项目

  • 选择项目中的顶层

enter image description here

  • 选择目标

enter image description here

  • 点击“Build Phases”,然后点击“Link Binary with Libraries”,确保你的框架包含with optional selected

enter image description here

  • 仍然在“构建阶段”,转到左上角并选择+按钮。在下拉菜单中选择“New Copy Files Phase”。

enter image description here

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

enter image description here

  • 您将看到您的项目层次结构。向下滚动到第三步中添加框架的“Frameworks”文件夹,或者在顶部的搜索栏中搜索它。选择你的框架,然后点击“添加”。

enter image description here

  • 确保选择了“代码签入复制”,并包含了您的框架。

enter image description here

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

  • # EYZ0 + # EYZ1 + # EYZ2
  • # EYZ0 + # EYZ1

如果有开发pod,从模拟器中删除应用程序,从pod中安装-> clean ->再次运行…

在嵌入式二进制文件中添加框架 # EYZ0 < / p >

然后清洁和建造。

  1. 进入xcode ->工作空间设置文件
  2. 点击旁边的箭头,出现/Users/apple/Library/Developer/Xcode/DerivedData
  3. 选择Derived数据并将其移动到Trash。
  4. 然后重新打开xcode。
  5. 清理项目并再次运行。

以上步骤解决了我的问题。

在尝试了网上所有的方法和我自己的试错技巧100次之后。最后我解出来了。- Apeksha Sahu
授权这台计算机- Apeksha Sahu 5分钟前
第二步……在iPad和iPhone的设置中使用Goto开发人员,并使用标识符重新索引,并清除信任计算机的一切。它为我工作........ .......从Mac OS seirra beta最新版本重新安装Mac OSHigh seria 10.13.15版本后,到重新安装Xcode最新版本后,更新所有证书。等等等等等等……你能想象我用了多少方法。- # EYZ0 < / p >

当我创建一个新的配置和构建方案。时也是一样

所以我的解决办法就是逃跑

pod install

这个新创建的配置。

enter image description here

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

尝试在构建设置中将ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES标志(在早期的xcode版本中:Embedded Content Contains Swift Code)从NO更改为YES。

在我的案例中,我的项目是用objective-c编写的,库中有Swift文件。所以我把项目建立设置标签中的“始终嵌入Swift标准库”改为是的,它变得完全ok。

如果你使用Xcode 11或更新版本:

  1. 导航到目标的设置并选择一般

Target Settings/General .

  1. 向下滚动到框架,库和嵌入式内容

  2. 确保Embed &SignEmbed Without Signing值在必要时被选择为Embed选项。

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

Xcode 11

  1. 导航到目标的设置并选择“常规”。
  2. 寻找“框架、库和嵌入式内容”
  3. 保持“不要嵌入”,并确保你的所有目标(如果你有多个目标)都只设置了自己的框架,而不是其他目标。

在# EYZ0

我也面临着同样的问题

General选项卡 > 框架、库和嵌入式内容中更改“请勿嵌入”仍然会导致相同的错误。

什么解决了我是添加框架构建阶段选项卡 > 嵌入框架部分

——更新

我观察到,在Xcode 11中运行时,在以前版本的Xcode中构建的项目嵌入框架部分不可用,请找到以下步骤来实现解决方案:

1:首先需要在构建阶段标签下添加新建复制文件阶段

enter image description here

2:第二,更改添加阶段的名称为Embed Frameworks # EYZ0 < / p >

3:修改目标为框架

enter image description here

4:添加发生错误的框架。

enter image description here

运行时错误:dyld:库未加载:@rpath/<

它是由Dynamic Linker引起的运行时错误

dyld: Library not loaded: @rpath/<some_path>
Referenced from: <some_path>
Reason: image not found

错误Library not loaded@rpath表明Dynamic Linker找不到二进制文件。

  1. 检查动态框架是否添加到前面目标General -> Frameworks, Libraries, and Embedded Content (Embedded Binaries)。拖放一个框架到Copy items if needed<一口>[对]< /一口>的项目中是非常简单的,并且错过了在
    中添加框架作为隐式依赖项 Frameworks, Libraries, and Embedded Content(或检入Add to targets)。在这种情况下,在编译时Xcode构建它为成功,但当你运行它时,你得到运行时错误

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

    <李>动态框架:
    • # EYZ0
    <李>应用程序:
    • # EYZ0
    • # EYZ0
  1. 框架的Mach-O file<一口>[对]< /一口> -动态库和应用程序的Frameworks, Libraries, and Embedded Content<一口>[对]< /一口> -不嵌入。

动态链接器

Dynamic Library Install Name(LD_DYLIB_INSTALL_NAME),由loadable bundle使用(Dynamic framework作为衍生品),其中dyld开始发挥作用
Dynamic Library Install Name -二进制文件的路径(不是。framework)。是的,他们有相同的名字,但MyFramework.framework是一个packaged bundleMyFramework二进制文件和资源 到目录的路径可以是绝对路径,也可以是相对路径(例如:# eyz0, # eyz1, # eyz2)。相对路径更可取,因为它与锚一起更改,当您将包作为单个目录

分发时,锚非常有用

绝对路径 - Framework1示例

//Framework1 Dynamic Library Install Name
/some_path/Framework1.framework/subfolder1

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

@executable_path

@executable_path -相对于加载框架的可执行的二进制文件 用例:Dynamic frameworkApplication(应用程序二进制路径 是@executable_path)或更复杂的例子,其中App Extension<一口>[对]< /一口>Containing App的一部分,其中有Dynamic Framework。有2 @executable_pathApplication目标(应用程序二进制路径是@executable_path)和App Extension目标(应用程序扩展二进制路径是@executable_path)) - Framework2示例

//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

@loader_path

@loader_path -相对于导致框架被加载的bundle。如果它是一个应用程序,那么它将与@executable_path
相同 用例:框架与嵌入式框架- Framework3_1和Framework3_2内部

//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

@rpath -跑道路径搜索路径

# EYZ0例子

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

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

  • < p >应用程序:

    • Runpath Search Paths(LD_RUNPATH_SEARCH_PATHS) - @rpath -定义了一个模板列表,将被@rpath取代。消费者使用@rpath字指向此列表

       @executable_path/../Frameworks
      
    • 检查Build Phases -> Embed Frameworks -> Destination, Subpath以确定嵌入框架的确切位置

  • < p >动态框架:

    • Dynamic Library Install Name(LD_DYLIB_INSTALL_NAME) -指出@rpath与二进制文件的本地bundle路径一起使用

      @rpath/Framework2.framework/subfolder1
      
//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

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

对象文件显示工具

//-L print shared libraries used
//Application otool -L
@rpath/Framework2.framework/subfolder1/Framework2


//Framework2 otool -L
@rpath/Framework2.framework/subfolder1/Framework2


//-l print the load commands
//Application otool -l
LC_LOAD_DYLIB
@rpath/Framework2.framework/subfolder1/Framework2


LC_RPATH
@executable_path/../Frameworks


//Framework2 otool -l
LC_ID_DYLIB
@rpath/Framework2.framework/subfolder1/Framework2

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

CocoaPods使用use_frameworks!<一口>[对]< /一口>调节Dynamic Linker

< a href = " https://stackoverflow.com/a/59216151/4770877 " > < / >(词汇)

[Java ClassLoader] .

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

use_frameworks!

一旦行从你保存的文件中删除,只需从控制台运行:

$ pod update

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

  1. 项目中,选择目标。
  2. 在顶部添加一般标签。
  3. 在“框架,库和嵌入式内容”部分下,添加框架(对我来说是CoreNFC)。重复其他目标。
  4. 点击顶部的构建阶段,展开“用库链接二进制文件”。
  5. 使麻烦的框架成为可选的(从必需的)。

这让我可以在不做任何代码更改的情况下编译旧/新iphone。我希望这能帮助到其他人。

简单的解决方案是按照这张截图,然后崩溃就会消失:

enter image description here

注意:这是Xcode 11.5

在我的情况下,应用程序只在真实设备上崩溃,它发生在标准库。 我尝试了之前提到的很多步骤,1h I 只需删除应用程序从真实的设备,并重新安装。

对于SumUp用户,如果您正在加载最新的SumUpSDK。xcFramework,那么您需要确保它被设置为“嵌入”。Sign"从目标的应用程序的General选项卡。

也就是说,把上面的语句颠倒过来(这样更容易理解):

  1. 进入“项目导航器”;(即第一个图标显示所有项目项等)

  2. 从树的顶部选择你的项目。

  3. 在页面中间的菜单上(稍向右),在“目标”下选择您的应用程序;

  4. 在顶部选项卡中,选择“一般”;

  5. 向下滚动到“框架,库和嵌入式内容”;

  6. 从列表中选择你的Lib

  7. Select "Embed &Sign"从它旁边的下拉列表。

  8. < p >清洁

  9. 重建和运行。

我希望这能有所帮助。

H

对我来说,我不得不把XcodeKit.framework从“不嵌入”;→“嵌入,Sign"

enter image description here

对我来说,这是个问题

运行脚本

我只是删除运行脚本和它的工作