使用Xcode时出现“找不到模块”的错误,但框架确实存在。

535
我目前正在使用Swift编码,但是遇到了一个错误:

没有这个模块Social

但我不明白,因为该模块在我的项目中,已经在“链接的框架和库”和“嵌入式二进制文件”中声明了。
这个框架是用Objective-C编写的,所以我为它编写了一个桥接头文件。
请问,如何让Xcode识别这个框架? 错误模块 项目 链接的框架和库 桥接头文件

31
不想显得太明显,但你尝试过完全清理和构建吗? - Kalel Wade
31
如果框架头文件已经包含在桥接头文件中,则无需在Swift源代码文件中导入它。 - Martin R
3
你可能需要使用引号来导入代码库:#import "Social/Social.h"。为了使内容更加通俗易懂,此翻译并未改变原文意思,并省略了任何解释和额外信息。 - Martin R
4
在Xcode中,使用CocoaPods时可能会出现与'CocoaPods "没有这个模块"相同的错误。 - AsimRazaKhan
4
我把部署目标从11改为了10,但忘记在Podfile中修改platform :ios, '10.0'。这就是解决方法。 - Artur Guseynov
显示剩余14条评论
85个回答

863

如果是周五下午或凌晨1点之后:

打开 xcodeproj 而不是 xcworkspace 会导致类似此错误的问题...


2
我曾试过将其视为圣杯。有趣。谁知道,但是退出并重新打开工作区实际上也起作用了。清理,然后构建。 - mondousage
5
晚上9点使用Fastlane,在指定健身房(项目:---)时出错,应该指定工作区中的健身房(工作区:----)。谢谢! - RickiG
7
来自安卓,这让我感到有趣。 - hjchin
31
2021年,这个答案仍然如此准确。哈哈哈。 - androidStud
1
对于那些使用xcodebuild命令行进行构建的人,指定工作区即-workspace <>就可以解决问题。 - mr5
显示剩余14条评论

409

我不确定为什么会出现这种情况,但解决方法之一是进入你的构建设置,将框架搜索路径定义为包含相关框架的文件夹。如果框架已经放在项目目录中,只需将框架搜索路径设置为$(SRCROOT)并递归设置即可。


8
谢谢,我需要在项目的构建设置中进行此操作,而不是目标构建设置。 - Binary Pulsar
10
对我来说,关键是找到一条路径来在“框架搜索路径”中使用框架。${TARGET_BUILD_DIR}/YourFrameworkName.framework 对我很有效。另请参见https://dev59.com/Io_ea4cB1Zd3GeqPPou9。 - Chris Prince
13
需要在项目构建设置(Project Build Settings)中进行操作,而不是在目标构建设置(Target Build Settings)中。 - Maksim
829
我通过去洗手间解决了这个问题。回来后它就能用了。我很确定我尝试了这个帖子里的所有方法,不知道哪一步起了作用。我也在某个时候祈祷过。 - nmdias
3
我已经尝试了一切……真的是一切。甚至像 @nmdias 建议的那样去上厕所 :D ……到目前为止还没有解决办法……:( - Subrata Mondal
显示剩余15条评论

115

请确保你子项目中的配置命名与“父”项目中的匹配。如果配置命名不完全匹配(区分大小写),Xcode将中止存档过程并显示错误“No such module ...”。

也就是说,如果你有一个名为“AppStore”的配置的“父”项目,你必须确保所有子项目也具有此配置名称。

请参见我附加的截图。

在"父"项目中设置配置

在第一个子项目中设置配置

在第二个子项目中设置配置


1
在我的情况下,子项目只有DebugDistribution,而其父项目试图构建Release版本。解决方案是在子项目中复制Distribution并将该副本重命名为Release - olivaresF
2
这导致我找到了问题,但是我通过在我的自定义配置中添加框架搜索路径来解决它,因为我不想触及第三方子项目 :) - DeFrenZ
4
没看完整个答案,但当我看到重点在配置方面时,就立刻明白了。图像胜过千言万语。+10 - Maciek Czarnik
如果您有一个子项目(例如我的情况是带框架的子项目),那么这就是正确的答案,因为当 .framework 被构建时,它会位于不同的构建文件夹中,当配置不匹配时,Xcode 就无法找到框架(模块)。 - smartwolf
我有一个结构类似于这样的项目(不像答案中的 AppUIAppDomain 嵌套在 App 中):
  • App.xcodeproj
  • AppUI.xcodeproj
  • AppDomain.xcodeproj
因此,当我这样做并将 AppUI.frameworkAppDomain.framework 添加到 Frameworks、Libraries and Embedded content 部分的 App 中时,这个答案对我有效。
- Taras
显示剩余5条评论

52

我不太确定为什么问题的评论中Martin R的回答被如此忽视:

确保您尝试简单地跳过导入框架,因为它已经在桥接头文件中添加。

希望这有所帮助。


46

我在使用Cocoapods和Swift时遇到了相同的问题。我没有注意到Podfile中的以下几行代码:

# Uncomment this line if you're using Swift
# use_frameworks!
所以,我所要做的就是将它改成:
# Uncomment this line if you're using Swift
use_frameworks!

……然后它起作用了 :)


1
对我来说,use_frameworks甚至不在我的Podfile中,所以我添加了它。 - PhoenixB
确切地说,这实际上解决了@terhechte提到的框架搜索路径问题。 - Mohamed Salah

36

以下步骤适用于我:

  1. 退出xcode
  2. 在终端中运行"pod update"
  3. 再次打开.xcworkspace并进行构建。

1
这些步骤对我有用...谢谢...我运行了 "Pod install",但没有收到 "Module XXX not found away.." 的消息,但是在退出XCode并重新打开Workspace后,问题得以解决。 - Ash
1
我的问题是在添加新的构建配置和方案后,我得到了“找不到模块”的错误。退出Xcode并没有起作用,但在执行pod install之后它可以正常工作。 - William Hu
这对我有用。为什么会修复问题? - user5791460
1
它对我起作用了。在重新打开projectname.xcworkspace后,需要再次清理和重建才能使其正常工作。 - Prashant
https://dev59.com/Nl0b5IYBdhLWcg3wLOvQ#69927210 - Asfar Hussain Siddiqui

27

请将此截图与您的构建设置进行比较。 这可能有用。 进入框架搜索路径:

在此输入图像描述


还被Chris Prince提到过。 - Franklin Yu
1
这真的帮了我很多,谢谢。但是提醒其他读者:在完成此操作后,请删除您的Derived文件夹并重新启动Xcode。 - Eray Alparslan
当我将SnapKit添加到以下位置时,它对我起作用:1)Frame Search Paths -> "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" 2)Header Search Path -> "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit/SnapKit.framework/Headers" 3)Other C Flags -> framework "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" - Taras

21

在我的情况下,尝试多次找出导入框架时出了什么问题后,我最终发现框架本身就是问题所在。如果您没有从可信来源获取框架,您应该检查框架并确保它包含一个名为 Modules 的文件夹和其中的一个 module.modulemap 文件。如果未出现 module.modulemap,则会出现“No such module 'MyFramework'”错误。

显示 SwiftyJSON.framework 目录结构示例

如果缺少“ MyFramework.swiftmodule”文件夹中的“ Modules ”文件夹,则可以找到框架,但 Xcode 不会知道其内容,因此会出现不同的错误。


2
由于某些原因,即使存在,也不会在Xcode9.1中显示。右键单击您的框架>在查看器中显示>确保您的modulemap在那里。如果您正在pods项目中使用手动框架,请在添加新手动框架或更新现有框架后重建您的pods。 - Christopher Larsen
1
谢谢!我自己创建了这个文件,它也起作用了:框架模块名称 { umbrella header "NAME.h" export * module * { export * } } - Sjoerd Perfors
这最终成为了我的问题。在框架中,我发现“定义模块”设置为NO;将其更改为YES会创建上述的ModuleMap文件和文件夹。 - Aaron Vegh

21

我也遇到了这个问题。对我而言,解决方法是两个项目之间的归档方案不匹配。我有一个包含框架项目和应用程序项目的xcworkspace。问题在于我的应用程序的存档方案中,我使用的构建配置与框架用于其存档方案的构建配置不同。我将两个构建配置都设置为“发布”,并解决了该问题。


这对我有用。我将主项目的构建配置设置回发布(从分发),所以现在它与子项目匹配。一切正常。谢谢! - Charlie S
1
我们的框架没有我们用于该项目的AdHoc配置 - 这意味着它无法与项目一起构建。 - Johan

20

Xcode编译错误:没有这个模块

//Swift
import <module_name> //No such module '< module_name >'

这是编译时错误。在很多情况下都会出现:

  • 打开了.xcodeproj而不是.xcworkspace
  • module.modulemap.swiftmodule[关于]

Objective-C库/框架目标

确保生成的二进制文件包含module.modulemap文件,并且其头文件位于Build Phases -> Headers section中。

Framework Search Paths

消费者->框架

如果您尝试构建一个没有设置Framework Search Paths(消费者)的应用程序。将Framework Search Path设置为指向框架资源后,Xcode将成功构建项目。但是,当您在模拟器中运行应用程序时,由于Image not foundabout原因,会导致崩溃。

它可以是绝对路径或相对路径,例如$(SRCROOT)$(SRCROOT)/..用于工作区

导入路径

Swift消费者-> Swift静态库

导入路径(消费者)应指向.swiftmodule

查找隐式依赖项

当您有一个隐式依赖项但查找隐式依赖项被关闭时

CocoaPods

  • 检查此依赖项是否存在于目标中
pod deintegrate
pod install

CocoaPods UI测试包

用于应用程序目标,其中使用了来自CocoaPods的附加依赖项。要解决此问题,请在Podfile中使用inherit![关于]

[递归路径]


  1. 打开ProjectName.xcodeworkspace
  2. 产品 -> 构建
- Kuvonchbek Yakubov
@yoAlex5,你能否详细说明一下Swift静态库部分。我创建了一个自定义的静态库,但在尝试将其实现到测试项目中时,出现了相同的“无模块”错误,无法导入它。我已经将“库搜索路径”值复制到“导入路径”中。 - Sushree Swagatika
1
对我来说,问题是打开了.xcodeproj而不是.xcworkspace文件,经过快速搜索,节省了一些关键的开发时间。感谢@yoAlex5的帮助。 - Sauvik Dolui
解决这个问题的方法是使用.xcworkspace代替.xcodeproj打开工程。 - Doilio Matsinhe

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