dyld:库未加载:@rpath/libswiftCore.dylib。

465

我正在尝试在我的iPhone 4s上运行一款Swift应用程序。它在模拟器上运行良好,我的朋友也可以在他的iPhone 4s上成功运行它。我使用的是iOS 8和Xcode 6正式版本。

我已经尝试了以下:

  • 重启Xcode、iPhone、电脑
  • 清理并重新构建
  • 吊销并创建新的证书/配置文件
  • Runpath搜索路径为$(inherited) @executable_path/Frameworks
  • 嵌入内容包含Swift代码是'Yes'
  • 代码签名标识是开发者

下面是完整的错误信息:

dyld: Library not loaded: @rpath/libswiftCore.dylib
  Referenced from: /private/var/mobile/Containers/Bundle/Application/LONGSERIALNUMBER/AppName.app/AppName
  Reason: no suitable image found.  Did find:
    /private/var/mobile/Containers/Bundle/Application/LONGSERIALNUMBER/AppName.app/Frameworks/libswiftCore.dylib: mmap() error 1 at
address=0x008A1000, size=0x001A4000 segment=__TEXT in Segment::map() mapping
/private/var/mobile/Containers/Bundle/Application/LONGSERIALNUMBER/APPLICATION_NAME/Frameworks/libswiftCore.dylib

2
可能是一个重复问题:dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib - Sruit A.Suk
4
清理并重新构建对我有用。 - MoralCode
解决方案在这里。同一主题。 - Tarik
清理并重新构建我的项目,使其能够正常工作。 - Syed Zahid Shah
我曾经遇到过同样的问题... 我通过添加以下内容解决了它:在您的podfile中:使用 use_modular_headers! 代替 use_frameworks!祝好运!希望这对你有用! - XtremeDevX
59个回答

20
你需要将“运行路径搜索路径”设置为“@executable_path/Frameworks”,如下图所示的构建设置屏幕截图:

enter image description here

如果您有任何用Swift制作的嵌入式框架,则可以将构建选项“嵌入式内容包含Swift代码”设置为“YES”。

1
是的,在Swift框架中,将“Embedded Content Contains Swift Code”设置为YES是必要的。 - david
我制作了一个命令行工具,它使用一些dylibs,这些dylibs需要与工具一起在本地目录中交付(而不是在/usr/lib或类似位置)。otool -L用于这些dylibs告诉我它们已经使用@rpath/...来设置自己的路径。现在,通过将Runpath搜索路径设置为该文件夹的路径,我可以运行我的工具,并且它会找到存储在旁边文件夹中的dylibs。 - Thomas Tempelmann
尝试将Swift模块添加到React Native项目时,却无法找到@rpath/libswiftAppKit.dylib。通过问题我了解到,必须根据这些说明添加搜索路径:@executable_path/../Frameworks/。我不知道这是否仅适用于我的项目结构。值得注意的是,我不必清除DerivedData即可使此设置生效! - Jamie Birch

16

我认为苹果已经总结了这个问题,即在尝试引用Swift库libswiftCore.dylib时,Swift应用程序崩溃

引用自技术问答QA1886:

在尝试引用Swift库libswiftCore.dylib时,Swift应用程序会崩溃。

问:当我尝试运行我的Swift语言应用程序时,在我的设备控制台中出现了libswiftCore.dylib加载错误,我该怎么办?

答:要纠正此问题,您需要使用主题组织单位(OU)设置为您的团队ID的代码签名证书对您的应用程序进行签名。所有企业和标准iOS开发人员证书,在iOS 8发布后创建的证书都在正确的位置上具有新的团队ID字段,以允许Swift语言应用程序运行。

通常,此错误会在设备的控制台日志中出现,类似于以下消息之一:

[....] [deny-mmap] mapped file has no team identifier and is not a platform binary:
/private/var/mobile/Containers/Bundle/Application/5D8FB2F7-1083-4564-94B2-0CB7DC75C9D1/YourAppNameHere.app/Frameworks/libswiftCore.dylib

Dyld Error Message:
  Library not loaded: @rpath/libswiftCore.dylib

Exception Type: EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000001, 0x0000000120021088
Triggered by Thread: 0

Referenced from: /private/var/mobile/Containers/Bundle/Application/C3DCD586-2A40-4C7C-AA2B-64EDAE8339E2/TestApp.app/TestApp
Reason: no suitable image found. Did find:
/private/var/mobile/Containers/Bundle/Application/C3DCD586-2A40-4C7C-AA2B-64EDAE8339E2/TestApp.app/Frameworks/libswiftCore.dylib: mmap() error 1 at address=0x1001D8000, size=0x00194000 segment=__TEXT in Segment::map() mapping /private/var/mobile/Containers/Bundle/Application/C3DCD586-2A40-4C7C-AA2B-64EDAE8339E2/TestApp.app/Frameworks/libswiftCore.dylib
Dyld Version: 353.5

新证书在构建存档和打包应用时需要使用。即使您拥有其中一个新证书,重新签署现有的Swift应用程序存档也不起作用。如果它是使用iOS 8之前的证书构建的,则需要构建另一个存档。

重要提示:如果您需要撤销并设置新的企业分发证书,请谨慎使用。如果您是内部企业开发人员,那么您需要小心,不要撤销任何一个您的企业员工正在使用的分发证书,因为使用该企业分发证书签署的所有应用程序将立即停止工作。以上仅适用于企业分发证书。对于企业/标准iOS开发人员,可以放心地撤销开发证书。

根据AirSign团队state,这个问题源于内部证书主题字段中缺少OU属性。

主题: UID=269J2W3P2L, CN=iPhone分发: 公司名称,OU=269J2W3P2L, O=公司名称,C=FR

我有一个企业级开发证书,创建一个新的解决了问题。


在花费了许多时间尝试理解为什么我的新CI设置无法正确发布测试版应用程序(确实是企业帐户)之后,我发现在导出选项中,compileBitcode必须为true。 - gderaco

10

假设我们的项目P正在导入一个自定义库L,那么你必须将L添加到

P -> Build Phases -> Embed Frameworks -> +。这对我有用。

输入图像描述


9
最简单且容易被忽略的方法:清理并重新构建。
在尝试了上面的答案但没有解决问题之后,这种方法解决了问题。

对我有用,谢谢!(看到这种方法如此简单,我先尝试了它,而不是上面的其他答案;感谢您节省了我的时间!) - auspicious99

8

当升级Xcode(以及随后升级到新版本的Swift)并且您的项目使用一个使用旧版/先前版本的Swift构建/编译的框架时,也可能会导致此错误消息。

在这种情况下,重新构建框架并重新添加它将修复问题。


这种情况发生在我身上,从Xcode 9.2升级到9.3。尽管我直到升级很久之后才发现它,因为只要项目之前使用Xcode 9.2构建过,它就可以无限期地在Xcode 9.3上工作。只有在进行干净的检出后,我才发现了这个问题。 - Svein Fidjestøl
我认为这个答案的评分还不够高。如果使用Carthage和更新版本的Xcode进行安装,您需要重新构建Carthage库以解决此问题。 - Darren

7

7

当我创建一个发布版本时,Xcode 13+出现了同样的问题。我不得不浪费时间来排查这个问题,最终我通过以下步骤解决了问题:

在“构建设置-链接”中的“运行路径搜索路径”添加Release的新条目。

/usr/lib/swift

进入图像描述

添加完上述内容后,我的应用程序就可以正常运行而不会崩溃了!


6

将目标的“复制Pod资源”更改为:

"${SRCROOT}/Pods/Target Support Files/Pods-Wishlist/Pods-Wishlist-resources.sh"

to:

"${SRCROOT}/Pods/Target Support Files/Pods-Wishlist/Pods-Wishlist-frameworks.sh"

1
除非这破坏了其他东西,否则这对我来说是修复的方法! - RealCasually
那个东西还有什么问题吗?你能帮我改进答案吗? - Bartłomiej Semańczyk
它似乎可以工作,但运行“pod install”会覆盖更改。 - RealCasually
@RealCasually 你是对的。有没有办法防止覆盖或任何解决方法? - Bartłomiej Semańczyk
天啊,这就是我的问题所在。在尝试了100种其他方法和4个小时的折腾后,终于找到了答案。framework.sh和resources.sh之间到底发生了什么? - kennydust
显示剩余2条评论

6

我通过删除派生数据解决了这个问题,这次它正常工作了。尝试使用Xcode 7.3.1GM


删除我的派生数据也起作用了,我之前已经进行了清理(CMD+K),以防万一,错误痛苦地消失了! - Stu P.

5

经过尝试,我终于发现构建似乎并不总是一遍又一遍地包含每个细节。也许是为了加快进程……为了确保在设备上运行之前进行完整的打包,请先进行清理:Shift-Cmd-K。然后使用Cmd-B进行构建。之后在您的设备上运行它。简单易行。祝愿这里所有友好的人!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接