Xcode警告:"输出文件有多个构建命令"

504

我收到了这样的错误提示:

[WARN]警告:输出文件/Developer/B/Be/build/Release-iphonesimulator/BB.app/no.png有多个构建命令

[WARN]警告:输出文件/Developer/B/Be/build/Release-iphonesimulator/BB.app/d.png有多个构建命令

[WARN]警告:输出文件/Developer/B/Be/build/Release-iphonesimulator/BB.app/n.png有多个构建命令

但是我已经检查过Xcode,完全没有看到这些文件的任何重复项。正如这篇文章在苹果邮件列表中所述,确实没有重复。

26个回答

818
在项目导航器中选择您的Xcode项目文件。这将显示项目设置以及项目中的目标。查看“复制捆绑资源”构建阶段。您应该在该列表中找到重复引用的文件两次。删除重复引用。
Xcode 抱怨您正尝试将同一文件与应用程序捆绑两次。

1
当我从构建文件夹中删除一些资源(使用Finder)时,会发生这种情况。用相同名称更新的资产替换,并在XCode内拖动它们并标记“添加到目标”选项。看起来XCode不同步,复制那些条目到“复制包资源”。 - brainondev
1
我想添加一件事情。如果你最终不知何故得到了大量重复的引用(就像我一样),你可以点击“验证设置”,它会自动删除重复的引用。比手动寻找它们要容易得多。 - Jon Mattingly
1
我曾经遇到过类似的问题。这个答案最接近了。即使项目只显示文件一次,<projName>.xcodeproj/project.pbxproj 文件中仍然有重复的条目。这是一个合并问题。使用vi编辑解决了问题 :) 感谢您指引我正确的方向 :) - javatarz
11
值得注意的是,如果您在“复制捆绑资源”阶段有大量重复的文件,您可以在页面底部点击“验证设置”,XCode将提示您有关重复项,并在您点击“执行更改”时删除所有重复项。这比单独查找它们要快得多。 - Yeti42
1
当我重新将“Published-iOS”添加到项目中时,我在SpriteBuilder模板中遇到了类似的问题。结果发现它希望它是一个“文件夹引用”,而不是一个组,并且已经将整个文件夹添加到“复制包资源”中。因此,即使单个资源未出现在该列表中,请确保它未从文件夹中添加。 - samkass
显示剩余5条评论

127

当您添加基于Git的子项目时,就很容易出现这种情况。虽然您无法从查看器中看到它,但Xcode不聪明,无法忽略.git子文件夹,因此它会对名为“master”或“exclude”的多个文件感到非常困惑(标准的git repo文件)。在Xcode4中,进入项目(左侧树的根)然后单击应用程序目标并展开“Copy Bundle Resources”,然后删除所有对.git的引用,您不应将它们嵌入您的应用程序中。


43
我摸索了一下,这可能会对某些人有所帮助:应用程序目标 -> 构建阶段 -> 复制捆绑资源。 - jaime
2
我在我的Xcode项目中有多个文件具有相同的名称(但位于不同的目录中)。不小心,其中一个在“复制捆绑资源”步骤中都包含了它们,这将导致其中一个在生成的应用程序包中被覆盖。只需删除其中一个即可。 - BastiBen

118

其实,这个问题的答案非常简单。

在你的 Xcode 项目中搜索引起警告的文件,然后只需删除其中一个即可。

Xcode 在搜索结果中仅显示该文件的一个引用,但不要停在那里,继续删除它。(最好在删除之前备份项目文件)

现在再次构建项目,警告应该会消失。

(此答案适用于先前版本的 Xcode)


但是这些文件不再出现在XCode的组和文件窗格中了。这是怎么回事? - Tejaswi Yerukalapudi
1
如果你仍然遇到问题,只需从Xcode中删除所有文件(不要在磁盘上删除它们),然后重新拖回来。如果此后仍然有问题,那么你可能有一些具有相同名称的资源(也许在不同的文件夹中)- 找到并重命名/删除。 Xcode 的输出会进入一个平面文件夹,因此目录结构会被忽略。 - n13

52

这并不是Xcode的Bug,尽管警告信息没有足够描述实际原因。

当您的项目中有多个文件同名时,就会出现此错误。您只需要删除或重命名重复名称的文件即可解决该问题。


1
是的,这是正确的答案。并且当您拥有资源文件(例如,在文件系统上位于不同目录中但具有相同名称的PNG文件)时,情况很容易发生 - 在构建过程中,它们都会被复制到一个目录中,即应用程序包中。 - Brynjar
@Brynjar,有没有解决方案可以允许具有相同名称的图像?或者防止图像被捆绑在一起? - Andrew
其实我发现你可以创建文件夹引用来避免捆绑。 - Andrew
这里有一种方法可以找到具有重复名称的文件,而不考虑目录 find . | grep -v \.git | rev | cut -d/ -f1 | rev | sort | uniq -c | sort 但是,这并没有解决我的问题。 - William Entriken

26

如果在项目中有两个同名文件,则会出现此问题。即使文件在XCode中分组,当项目编译时,所有文件最终都会结束在同一个目录下。换句话说,如果您有 /group1/image.jpg 和 /group2/image.jpg,编译后的项目将只有其中一个 image.jpg 文件。


20
如先前所提,如果您在项目导航器中有多个具有相同名称但位于不同组(黄色文件夹)中的文件,则可能会出现此问题。在我的情况下,这是有意为之的,因为我有多个子目录,每个目录都有一个“preview.jpg”,我想将它们复制到应用程序包中: group references 在这种情况下,您需要确保Xcode识别目录引用(蓝色文件夹图标),而不仅仅是组。 删除问题文件,并选择“删除引用”(以便我们不完全删除它们): remove group references 通过将它们拖回到项目导航器中来重新添加它们。在出现的对话框中,选择“为任何添加的文件夹创建文件夹引用”: add as folder references 注意,文件现在在项目导航器中具有蓝色文件夹图标: folder references 如果您现在查看目标的构建阶段下的“复制包资源”部分,您将注意到整个文件夹只有一个条目,而不是每个包含在目录中的项目都有一个条目。编译器将不会因为这些文件有多个构建命令而抱怨。

最佳答案!它在我的Xcode 12.2上运行。 - ΩlostA

15

Headers构建阶段中存在重复时,可能会发生这种情况的另一个版本。

要解决此问题...

  1. 进入项目目标
  2. 选择构建阶段
  3. 选择Headers构建阶段
  4. 输入警告中显示的名称
  5. 注意两个(或更多)条目
  6. 找到左下角的 +|-
  7. 选择其中一个条目,并单击 - 按钮

15

这不是一个bug。 Xcode的辅助功能可以帮助您。在项目导航器左侧选择目标。在设置底部点击“验证设置”。Xcode会检查设置并尽可能删除重复项。


8
在我的情况下,问题是由于组内目标和文件夹名称相同造成的。
只需将冲突的文件或文件夹重命名即可解决问题。

这与我遇到的情况类似。我有两个不同的目标,但模块名称相同。 - Lauren Yim

6

我找到了一个非常简单的解决方案:

  1. 从项目导航器中选择引起问题的文件
  2. 在文件检查器中取消文件的目标成员资格
  3. 构建项目
  4. 再次检查文件的目标成员资格

警告已经消失!参考下面的图片。

enter image description here


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