在Xcode 7中发现了意外的Mach-O标头代码:0x72613c21


74

我有一个使用ObjC动态框架的Swift项目,该框架必须与我的项目链接并嵌入到我的项目中。该项目在设备中运行正常,提交到App Store时,验证期间发生错误: Found an unexpected Mach-O header code: 0x72613c21

以下是验证日志:

2015-10-12 02:32:33 +0000 [MT] Beginning distribution assistant for archive: MusicFans, task: Validate
2015-10-12 02:32:33 +0000 [MT] Automatically selecting the only availaable distribution method <IDEDistributionMethodiOSAppStoreValidation: 0x7f851c1d96c0>
2015-10-12 02:32:34 +0000 [MT] [OPTIONAL] Didn't find archived user entitlements for <DVTFilePath:0x7f851b42db10:'/Users/panzhansheng/Library/Developer/Xcode/Archives/2015-10-11/MusicFans 11-10-15 上午8.29.xcarchive/Products/Applications/MusicFans.app/Frameworks/libswiftDispatch.dylib'>: Error Domain=NSCocoaErrorDomain Code=4 "Item at "/Users/panzhansheng/Library/Developer/Xcode/Archives/2015-10-11/MusicFans 11-10-15 上午8.29.xcarchive/Products/Applications/MusicFans.app/Frameworks/libswiftDispatch.dylib" did not contain a "archived-expanded-entitlements.xcent" resource." UserInfo={NSLocalizedDescription=Item at "/Users/panzhansheng/Library/Developer/Xcode/Archives/2015-10-11/MusicFans 11-10-15 上午8.29.xcarchive/Products/Applications/MusicFans.app/Frameworks/libswiftDispatch.dylib" did not contain a "archived-expanded-entitlements.xcent" resource.}
2015-10-12 02:32:34 +0000 [MT] [OPTIONAL] Didn't find archived user entitlements for <DVTFilePath:0x7f8529a08050:'/Users/panzhansheng/Library/Developer/Xcode/Archives/2015-10-11/MusicFans 11-10-15 上午8.29.xcarchive/Products/Applications/MusicFans.app/wavpack.framework'>: Error Domain=NSCocoaErrorDomain Code=4 "Item at "/Users/panzhansheng/Library/Developer/Xcode/Archives/2015-10-11/MusicFans 11-10-15 上午8.29.xcarchive/Products/Applications/MusicFans.app/wavpack.framework" did not contain a "archived-expanded-entitlements.xcent" resource." UserInfo={NSLocalizedDescription=Item at "/Users/panzhansheng/Library/Developer/Xcode/Archives/2015-10-11/MusicFans 11-10-15 上午8.29.xcarchive/Products/Applications/MusicFans.app/wavpack.framework" did not contain a "archived-expanded-entitlements.xcent" resource.}
2015-10-12 02:32:34 +0000 [MT] [OPTIONAL] Didn't find archived user entitlements for <DVTFilePath:0x7f850da13de0:'/Users/panzhansheng/Library/Developer/Xcode/Archives/2015-10-11/MusicFans 11-10-15 上午8.29.xcarchive/Products/Applications/MusicFans.app/FLAC.framework'>: Error Domain=NSCocoaErrorDomain Code=4 "Item at "/Users/panzhansheng/Library/Developer/Xcode/Archives/2015-10-11/MusicFans 11-10-15 上午8.29.xcarchive/Products/Applications/MusicFans.app/FLAC.framework" did not contain a "archived-expanded-entitlements.xcent" resource." UserInfo={NSLocalizedDescription=Item at "/Users/panzhansheng/Library/Developer/Xcode/Archives/2015-10-11/MusicFans 11-10-15 上午8.29.xcarchive/Products/Applications/MusicFans.app/FLAC.framework" did not contain a "archived-expanded-entitlements.xcent" resource.}
2015-10-12 02:33:07 +0000 [MT] Canceled distribution assistant

如果我从项目的“嵌入式框架”部分中删除了动态框架,那么它可以通过验证,但是由于缺少动态框架的图像而在设备中运行时崩溃了,有什么想法吗?顺便说一句,动态框架已禁用了位码,因此我的项目也禁用了位码,并且未进行代码签名。


您使用过CocoaPods吗?
弗拉基米尔·

6
您找到了解决方案吗?
jose920405 '16

Answers:


72

检查每个框架的两件事:

  1. 框架的Mach-O类型(在框架目标的“构建设置”中)

马赫

  1. 是否通过将其放在“构建阶段”->“嵌入框架”中来复制框架(或复制布鲁克·霍拉尔提到的捆绑资源)

嵌入框架

如果框架的Mach-O类型是“静态库”,则不应将其放在嵌入框架中;如果Mach-O类型是“动态库”,则应将其放在嵌入框架中。

在我的情况下,这是我手动添加的SocketRocket,它具有相同的框架名称的静态库目标和动态库目标。删除静态库目标并仅嵌入动态库框架之后,问题消失了。


注意事项

如果您无权访问源项目,则可以使用以下方法手动检查它是动态框架还是静态框架:https : //stackoverflow.com/a/32591983/308315


1
谢谢!就我而言,这就是问题所在。我在嵌入式框架中安装了Firebase。
Creagen

1
关于动态和静态库的很好的解释。2个小时已经在搜索
kokemomuke '17

1
该答案应该是被接受的答案。@ pzs7602接受吗?:)
Bob de Graaf

1
我不确定@ChewieTheChorkie。但是似乎所有嵌入框架也都出现在嵌入式二进制文件中。
Cosyn

1
@PetrusTheron是
Cosyn

21

仔细检查Build Phases-> Copy Bundle Resources,以查找框架或其他没有的二进制文件。

就我而言,这是我添加的第3方库(解析)。


就我而言,这是一个文件,已复制到项目中。我删除了此错误,错误消失了。然后,我重新添加了文件,现在看起来还不错。
戴维·布朗

1
如果单击“显示日志”按钮,然后查看“详细”日志文件,则可能会看到有问题的框架的名称。至少它在我身边。
斯坦·詹姆斯

对此答案+1,基本上是在{应用目标}->构建阶段->复制捆绑资源中,我在那里删除了与CocoaPods相关的任何内容-使此问题消失了
亨利

19

就我而言,我有一个手动拖入项目的框架,该框架在General->中列出Embedded Binaries,这会导致error Found an unexpected Mach-O header code: 0x72613c21。我将它从Embedded Binaries移到以后Linked Frameworks and Libraries,问题解决了。


17

我不知道为什么,但是豆荚似乎以某种方式变成了嵌入式二进制文件。所以我不得不将其删除,再次安装pod,问题消失了。

在此处输入图片说明

在Xcode 11上,您需要Do Not Embed在Frameworks,Libraries和Embedded Content中将其更改为。


感谢还不足以表示感谢。
Warpzit

9

我有一个同样的问题。我做了几件事,问题就消失了。我相信我的问题与Cocoapods版本有关,但是您可以在此处尝试一些方法。

首先通过以下方式清理DerivedData:

1.关闭Xcode

2.转到./Users/YourFile/Library/Developer/Xcode/DerivedData

3.删除此文件夹中的所有内容

4,运行Xcode

5,构建和清理

其次,由于某些原因,在最新的可可豆荚版本0.39中,我在运行时收到以下警告 pod install

[!]MY_TARTGET目标会覆盖EMBEDDED_CONTENT_CONTAINS_SWIFT`Pods / Target支持文件/Pods/Pods.release.xcconfig'中定义的构建设置。这可能会导致CocoaPods安装出现问题

我已经通过删除所有已安装的cocoapods降级了cocoapods:

sudo gem卸载cocoapods

然后安装旧版本:

sudo gem install cocoapods -v 0.38.1

这消除了警告,并且我能够消除错误“意外的Mach-O标头代码:0x72613c21”


我这样做-也做了pod安装-问题消失了。谢谢,这真是太好了。
n13

谢谢!很高兴它有所帮助。
CodeOverRide

我逐步尝试了您概述的步骤,并且在卸载/降级cocoapods时达到了终点。谢谢!
阿德里安

8

对我来说,我在Carthage/usr/local/bin/carthage copy-frameworks运行脚本中有Fabric二进制文件。

删除这些内容后,它解决了该问题。

我正在使用Xcode Version 9.4.1 (9F2000)


谢谢,这对我有用。我正在使用Xcode Version 10.3 (10G8)。但是我想知道我们是否仍然需要复制Fabric.frameworkCrashlytics.framework
红杏路

我不能回答这个问题。但是有一个运行脚本,Fabric需要您将其添加到调用的构建脚本中${PROJECT_DIR}/Carthage/Build/iOS/Fabric.framework/run。我的猜测是,这正在执行需要执行的任何操作。
Kubee

7

编辑:这似乎已在Xcode 8 Beta 3中修复。

我目前正在使用Xcode 8 Beta 2和带有纯swift Pod的Swift 3遇到此问题(这似乎是导致此问题的原因)。

将以下内容添加到我的Podfile中可以解决此问题。

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES'] = 'NO'
    end
  end
end

幸得此评论由渝澳GitHub上。


5

看看此Apple文档“ 在应用程序中嵌入框架”,转到“嵌入式静态库”部分,他们以如下方式解释此错误:

这是由于将静态库放在看起来像框架的捆绑结构中引起的;第三方框架开发人员有时将此包装称为静态框架。由于在这种情况下,二进制文件是静态库,因此应用程序无法将其嵌入应用程序捆绑包中。

它们还提供了一种修复方法:

您可以通过识别静态框架并将其从“嵌入式二进制文件”部分中删除来解决此错误。

您可以按照检查二进制链接中的说明完成操作


5

在XCode 11中,单击项目文件,选择目标,然后在“常规”选项卡上,展开“框架,库和嵌入式内容”,将“嵌入和签名”更改为“不嵌入”。


在Xcode版本11.2.1(11B500)下工作。我已经阅读了日志,并为我所有的第三方框架进行了更改。还修复了某些“ libSwift_XXX”框架,因为在此更改后它们不再出现。
Darkwonder

在我的情况下,这导致运行时错误dyld: Library not loaded
Adamski

我所有的库都是“请勿嵌入”,并且仍然是相同的错误。
firetrap '20

4

从中删除它们Embedded Binaries并将它们添加到中Linked Frameworks and Libaries,然后再次存档并上传到存储。


1
您应该确保不需要嵌入框架(复制到Frameworks文件夹中),否则当您尝试在设备上运行时,将出现dylib找不到异常。这可能具有欺骗性,因为它将在模拟器上正常工作。
乌鸦

3

链接二进制库嵌入框架中检查并查找重复的框架和库在项目的“构建阶段”选项卡中的“中。

只应在一侧...


感谢您的回答,但是为什么会这样呢?那应该是哪一个(链接或嵌入)?
Ashley Mills

2

我在使用FacebookSDK框架时遇到此错误。我从“构建阶段”的“嵌入框架”列表中将其删除,它解决了该问题。检查日志并找到引起错误的框架,正如其他人所提到的。


我不明白 FacebookSDK的框架是动态的,因此它们不应该位于“嵌入式框架”中吗?
Chewie The Chorkie

2

我在一个非常简单的Framework项目中遇到了这个问题。在我的框架项目中,我只有一个目标,而且目标还不错。我想添加一些单元测试,所以添加了两个新目标:iOS单元测试捆绑包目标和Single View Application目标(充当测试的主机应用程序)。但是,两个新目标都抛出此错误。

我发现问题是由新目标上设置为静态库的Mach-O Type构建设置引起的。显然,新目标是从父项目继承Mach-O类型。当我将Mach-O Type设置为正确的设置(单元测试为“ Bundle”,主机应用程序为“ Executable”)时,一切正常!我还必须清理构建,删除派生数据并重置模拟器才能使用新设置。


1
谢谢,这挽救了我的一天!
1

1

就我而言,这是由开发人员证书/团队变更引起的。

我从个人Dev Apple ID开始项目,然后将其更改为我的工作ID。当我们尝试导出.xcarchive时,则出现“ Match-O标头”失败。这里或在其他站点上描述的内容都没有任何改变。

当我将Team改回我的个人ID时,错误日志显示现在仅几个框架(最近添加)缺少.xcent文件。因此,我开始了整个新项目,粘贴了所有源代码和文件,然后运行cocoapod,一切正常。


1

我解决此问题的方法是Fabric/Crashlytics通过Cocoapods重新安装,而不是花哨的迦太基安装程序(它看起来有问题)。


1

以我在xcode 11中的情况为例,我解决了要设置的问题,未将其嵌入一般->框架,库和嵌入式内容中 在此处输入图片说明


0

来自Fabric的Mike。

这是Xcode Beta 2和3中的错误,已经在Beta 4中修复,更新到最新版本即可解决。


我还在Xcode 8.1中看到了这一点,最新版本是Crashlytics / Fabric。我不得不从我的项目中删除框架,以便可以提交它。请告知,因为我想使用它们。
elsurudo

我无法在8.1内重制此代码。对于Greg,潜在的问题是链接是嵌入式的,而不是链接的。见我们对Twitter社区在这里谈话:twittercommunity.com/t/...
迈克·邦内尔

0

我在Swift 2.3非CocoaPods项目中手动添加了PFFacebookUtils框架时遇到了这个问题。我通过从构建目标的“常规”页面的嵌入式框架部分中删除了所述框架来对其进行了修复,并在构建阶段->链接二进制文件与库中进行了链接


0

考虑到我投入大量时间来发现这个问题,这是由Cocoapods造成的。我当时在一个工作区中工作,该工作区同时具有iOS应用和命令行工具来启动一些管道和内容。我的文件如下所示:

target 'AppPipe' do
  platform :osx, '10.14'
  project 'AppPipe/AppPipe.xcodeproj'
  pod 'Yams'

  post_install do |installer|
    installer.pods_project.targets.each do |target|
      target.build_configurations.each do |config|
        config.build_settings['MACH_O_TYPE'] = 'staticlib'
      end
    end
  end
end

我以为该pods_install挂钩对于我在其中编写的作用域而言是本地的,但事实并非如此!实际上,它把我所有目标的配置都变成了staticlibs!这修复了它:

target 'AppPipe' do
  platform :osx, '10.14'
  project 'AppPipe/AppPipe.xcodeproj'
  pod 'Yams'
end

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
        # Only AppPipe always gets staticlib
        if target.name == 'AppPipe'
          config.build_settings['MACH_O_TYPE'] = 'staticlib'
        end
    end
  end
end


0

从库目标嵌入包时,即使使用,它们也可能生成可执行文件Mach-O Type = Bundle。因此,我们可以从xcarchiveProducts / Applications / APP_NAME / YourBundle.bundle / YourBundle)中删除这些可执行文件。



-1

可能的原因之一是嵌套框架。

受Golang的启发,我最近从以下位置重构了我项目的代码:

App(with all the code in one target)

到(“->”表示链接,ABCD表示框架)

B -> C
A -> B

App -> A
App -> B
App -> C

事实证明,Apple并未正式支持嵌套框架。因此,我不得不将依赖关系树展平为:

App -> D

D -> A
D -> B
D -> C

-2

我在Xcode 8 beta 3中遇到了同样的问题。我已修复了它从链接框架(项目=>目标=>常规页面)中删除Fabric和Crashlytics()的问题。


2
如果您实际上需要Fabric和Crashlytics(我需要这样做),那么这并不是一个“解决方案”。
格雷格·布朗
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.