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

创建一个Cocoa Touch框架项目 添加一个swift文件和一个类Dog 为设备构建一个框架 在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

I have tried to build on iOS 7.1 and 8.0 devices, they both have the same crash. However, I can build an app and run on the simulator fine. Also, I am aware that I can change the framework to form Required to Optional in Link Binary With Libraries, but it did not completely resolve the problem, the app crashed when I create an instance of Dog. The behavior is different on the device and simulator, I suspect that we can't distribute a framework for the device using a beta version of Xcode. Can anyone shed light on this?


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

有关更多信息,请参阅如何将“复制文件构建阶段”添加到我的目标。

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


在目标的General选项卡中,有一个Embedded Binaries字段。当你在那里添加框架时,崩溃就解决了。

参考资料在苹果开发者论坛。


对于大于或等于8的iOS

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

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

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

对于小于8的iOS

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

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

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


我不得不(在这里提到的内容之上)将以下一行添加到构建设置选项卡下的Runpath Search Paths: @executable_path /框架


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


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

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


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

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


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

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


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


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

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


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

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

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

我必须在框架项目的构建设置下设置动态库安装名称库(DYLIB_INSTALL_NAME_BASE),然后重新构建它。它被错误地设置为$(LOCAL_LIBRARY_DIR),我必须将其更改为@rpath。

所以在App Project的链接处理阶段,它指示主机App在运行时从/Library/Frameworks/fw动态加载框架。Framework/fw(运行时文件系统的根目录)而不是app /Frameworks/fw。框架/ fw

关于所有其他设置:它必须在构建阶段的3个地方,但当你将它添加到托管应用程序的General选项卡的嵌入式二进制设置时,这些都是一次性设置的。

我不需要设置额外的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

我已经解决了这个问题,在链接框架和库UserNotifications.framework框架中将Required更改为Optional。


我使用Swift3/Xcode 8.1创建了一个框架,并在Objective-C/Xcode 8.1项目中使用它。为了解决这个问题,我必须在构建选项下启用始终嵌入Swift标准库选项。

看看这张截图:


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

1)创建框架

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

2)访问你的框架

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

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

3)在项目中放置框架

将. Framework从Finder窗口拖放到应用项目的“Framework”文件夹中。

4)为框架配置app项目

选择项目中的顶层

选择目标

转到“Build Phases”,然后是“Link Binary with Libraries”,确保你的框架包含了可选选项。

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

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

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

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

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

司令部SHIFT键+ K 指挥部+ R


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


在嵌入式二进制文件中添加框架

然后清洁和建造。


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

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


After trying all the methods available on internet and my own trial and error tricks 100 times. Finally I was able to solve it. – Apeksha Sahu 6 mins ago Goto iTunes in Mac --> accounts-->Authorize this computer – Apeksha Sahu 5 mins ago second step.... Goto developer in settings in iPad and iPhone and reindex with identifiers and clear trust computers everything. It worked for me........ ....... After reinstalling Mac OSHigh seria 10.13.15 version from Mac OS seirra beta latest version, to reinstalling Xcode latest version, after updating all certificates. etc etc etc... as many methods as you can think I did. –


当我创建一个新的配置和构建方案时,也会发生同样的事情。

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

pod install

这个新创建的配置。


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


尝试在构建设置中将ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES(在早期的xcode版本中:嵌入式内容包含Swift代码)从NO更改为YES。


在我的案例中,我的项目是用objective-c编写的,库中有Swift文件。所以我把项目Build Settings选项卡中的“Always Embed Swift Standard Libraries”改为“Yes”,它变得完全ok了。


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

导航到目标的设置并选择General。

向下滚动到框架、库和嵌入式内容。 如有必要,请确保为“嵌入”选项选择了“嵌入&签名”或“嵌入不签名”值。


Xcode 11

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


在Xcode 11中

我也面临着同样的问题

在“常规”选项卡>“框架、库和嵌入式内容”中更改“不要嵌入”仍然会导致相同的错误。

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

——更新

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

1:首先需要在Build Phases选项卡下添加New Copy Files Phase。

2:第二,将添加的阶段名称更改为Embed Frameworks

3:将目标更改为Frameworks。

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


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

这是由动态链接器引起的运行时错误

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

错误库没有加载@rpath表示动态链接器找不到二进制文件。

Check if the dynamic framework was added to the front target General -> Frameworks, Libraries, and Embedded Content (Embedded Binaries). It is very simple to drag-and-drop a framework to project with Copy items if needed[About] and miss to add the framework as implicit dependency in Frameworks, Libraries, and Embedded Content(or check in Add to targets). In this case during compile time Xcode build it as success but when you run it you get runtime error Check the @rpath setup between consumer(application) and producer(dynamic framework):

动态框架: 构建设置->动态库安装名称 应用程序: 构建设置->运行路径搜索路径 构建阶段->嵌入框架->目标,子路径

框架的Mach-O文件[关于]-动态库和应用程序的框架,库和嵌入式内容[关于]-不嵌入。

动态链接器

Dynamic Library Install Name(LD_DYLIB_INSTALL_NAME) which is used by loadable bundle(Dynamic framework as a derivative) where dyld come into play Dynamic Library Install Name - path to binary file(not .framework). Yes, they have the same name, but MyFramework.framework is a packaged bundle with MyFramework binary file and resources inside. This path to directory can be absolute or relative(e.g. @executable_path, @loader_path, @rpath). Relative path is more preferable because it is changed together with an anchor that is useful when you distribute your bundle as a single directory

绝对路径——Framework1示例

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

相对路径允许您以动态的方式定义路径。

@executable_path

@executable_path -相对于加载框架的可执行二进制文件 用例:应用程序内部的动态框架(应用程序二进制路径 是@executable_path)或更复杂的应用程序扩展[关于]的例子,它是包含动态框架的应用程序的一部分。@executable_path用于应用程序目标(应用程序二进制路径为@executable_path)和应用程序扩展目标(应用程序扩展二进制路径为@executable_path)

//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 -跑道路径搜索路径

Framework2例子

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

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

Application: Runpath Search Paths(LD_RUNPATH_SEARCH_PATHS) - @rpath - defines a list of templates which will be substituted with @rpath. Consumer uses @rpath word to point on this list @executable_path/../Frameworks Review Build Phases -> Embed Frameworks -> Destination, Subpath to be sure where exactly the embed framework is located Dynamic Framework: Dynamic Library Install Name(LD_DYLIB_INSTALL_NAME) - points that @rpath is used together with local bundle path to a binary @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

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

CocoaPods使用use_frameworks![关于]规范动态链接器

(词汇)

(Java ClassLoader)


虽然每个人都在说将框架嵌入到嵌入式二进制文件中,但它仍然不起作用,因为我们在这里错过了一个重要的步骤。

下面是在Embedded binaries标签下添加二进制文件的两个正确步骤:

从General选项卡下的“Linked Frameworks and Libraries”中删除给出错误的框架。 现在只需在Embedded Binaries选项卡下添加已删除的框架,这就是所有需要做的事情。

在设备上运行它,保持微笑;)


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

use_frameworks!

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

$ pod update

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

在项目中,选择目标。 Goto General标签在顶部。 在“框架、库和嵌入式内容”部分,添加框架(对我来说是CoreNFC)。重复其他目标。 点击顶部的Build Phases,展开“Link Binary with Libraries”。 使麻烦的框架成为可选的(从必需的)。

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


在我的情况下,应用程序崩溃只发生在真实的设备和标准库。 我尝试了前面提到的很多步骤,1h后,我只是从实际设备中删除应用程序,然后重新安装。


对于SumUp用户,如果您正在加载最新的SumUpSDK。xcFramework,然后您需要确保从目标的应用程序的General选项卡中将其设置为“Embed & Sign”。

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

转到“项目导航器”(即显示所有项目项的第一个图标等) 从树的顶部选择您的项目。 在页面中间的菜单上(稍向右),在“Targets”下选择您的应用程序 在顶部选项卡中,选择“General” 向下滚动到“框架,库和嵌入式内容” 从列表中选择您的Lib 从它旁边的下拉列表中选择“嵌入&签名”。 清洁 重新构建并运行。

我希望这能有所帮助。

H


对我来说,我必须把XcodeKit.framework从“不嵌入”->“嵌入&签名”


对我来说,这是个问题

运行脚本

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


如果你也得到了这个控制台除了日志在回答:

原因:没有找到合适的图像。确实发现:

可能你的框架是为更高的部署版本构建的,而不是你的应用程序。例如,应用程序是为iOS 12构建的,框架是为iOS 14构建的,而你在iOS 12设备上运行。