在Xcode编译时,Swift出现退出代码1的错误 - 可能与桥接头文件有关。

45

我有一个 Obj-C 项目,现在想要迁移到 Swift。我已经成功地处理了各种类别的问题,但最近遇到了一个我似乎无法理解的问题。当我尝试编译我的当前代码库时,会出现以下(超级没用的错误消息):

Command /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc failed with exit code 1

enter image description here

我唯一的假设是它与我的 bridging-headers 有关,但 Xcode 没有给我足够的信息来确定这是否属实。

我正在使用 CocoapodsCorePlot 添加到我的项目中。我正在尝试将以下类迁移到 Swift 中:

Obj-C 类 (ScatterPlotContainer.h)

#import <Foundation/Foundation.h>

@class CPTScatterPlot;

@interface ScatterPlotContainer : NSObject
@property (nonatomic, strong) CPTScatterPlot *ahrsAlt;
@property (nonatomic, strong) CPTScatterPlot *calibration;
@property (nonatomic, strong) CPTScatterPlot *coreAlt;
@property (nonatomic, strong) CPTScatterPlot *pitch;
@property (nonatomic, strong) CPTScatterPlot *roll;
@property (nonatomic, strong) CPTScatterPlot *slip;
@end

Obj-c 类(ScatterPlotContainer.m)

#import <CorePlot/CPTScatterPlot.h>
#import "ScatterPlotContainer.h"


@implementation ScatterPlotContainer {

}
@end

Swift 转换

import Foundation

 class ScatterPlotContainer : NSObject {
    public var ahrsAlt : CPTScatterPlot;
    public var calibration : CPTScatterPlot;
    public var coreAlt : CPTScatterPlot;
    public var pitch : CPTScatterPlot;
    public var roll : CPTScatterPlot;
    public var slip : CPTScatterPlot;
}

我的桥接头文件

#import <CorePlot/CPTScatterPlot.h>

我已经尝试过的

当我从桥接头文件中注释掉#import <CorePlot/CPTScatterPlot.h>时,由于Swift不知道CPTScatterPlot是什么,我得到了一个错误。

我还尝试过 #import <CPTScatterPlot.h> 但也没有成功。

想法

所以我能想到的唯一可能是因为我正在使用一个 CocoaPods 库,所以可能需要添加一些模块名。错误信息并不是很有用。有人有建议吗? 是否我犯过某个严重的错误,或如何获得更详细的错误信息以弄清楚发生了什么?


所有的谷歌员工:这个错误是一个“万能”的错误,可能有很多原因。清理通常会有所帮助。如果不行,请回溯您的步骤,并找出哪些更改导致编译器失败。然后,打开一个错误报告 - Raphael
26个回答

44

我按照所有答案所说的做了,但我的问题没有得到解决。我发现问题与错误的函数调用有关。

函数语法没有问题,但是调用机制出了问题。

要检查此问题的确切错误,请执行以下操作:

选择问题导航器 > 单击错误将显示错误日志 > 在其中选择“全部消息”选项卡。

这将显示此错误的所有详细日志。

enter image description here

向下滚动,您会看到像下面这样的日志,在我的情况下

enter image description here

因此,通过阅读此信息,我发现函数调用出了问题。我浏览了我的代码并解决了它,下面是正确和错误的代码。

错误方式:

var region = MKCoordinateRegionMake(self.mapView.userLocation.coordinate, span)
// It will not shown error here but when you build project compiler shows error.

正确方式:

let region = MKCoordinateRegion(center: self.mapView.userLocation.coordinate, span: span)

1
Xcode 6实际上不会像那样记录日志(向下滚动只显示下一步),我最终不得不运行xcodebuild,感谢这个答案https://dev59.com/mV8e5IYBdhLWcg3wZ5ys#26848000。 - Daniel Galasko
@DanielGalasko:上面的错误显然很难找到。我已经提供了一个解决方法,但是出现这种错误可能有很多不同的原因。 - Kampai
我曾经遇到过类似的问题,使用 viewController.presentViewController(true, completion:nil) 时... 我将完成块与异步网络调用链接在一起(3或4个级别 - 即所谓的回调地狱),显然 Swift 编译器不喜欢它。我按照先前提到的避免使用多层回调块的方法解决了我的问题 :-) - Fdo
1
@Kampai 非常感谢 :) - N.Raval
1
太棒了!这实际上解决了我的问题。文件夹结构中缺少一些文件,我从Finder中添加回来了。谢谢@Kampai。 - Vinayak Hejib
1
谢谢!在我的情况下,当选择“所有消息”时,我得到的信息是Xcode实际上找不到我的桥接头文件,所以我必须提供正确的路径来解决问题。 - Chen Li Yong

8
我昨晚遇到了这个问题,但是上面的解决方法都没能解决我的问题。当我看到仅有的一个文件的文本编码被设置成UTF-16时,纯属巧合,否则我就要对着电脑干些坏事情了。这是我最后操作的文件,可能是由于一次错误的剪切/粘贴操作导致了奇怪字符的出现。我将这个文件中的代码剪切/粘贴到了一个简单的文本编辑器中。我删除了该文件,重新创建了它并将代码粘贴回去......然后就好了。 所以除了上述操作之外,还要检查文件的编码方式! :-)

谢谢,这个方法真的很有用!只是想强调一下,对于其他人来说:仅更改编码对我没有任何效果,但是在复制文本、删除文件、创建新文件并重新粘贴后问题得到解决。 - OwlOCR

4

我遇到了同样的错误信息。 解决方法是将Swift编译器设置中的优化级别设置为None。 这对我来说不是真正的解决方案,我认为这是Swift编译器中的众多错误之一。


这也解决了我的问题,尽管我正在努力找到优化器不喜欢的具体代码。 - Kendall Helmstetter Gelner
对我也有效,但仍在寻找优化器为什么讨厌我的代码 -_- - Alak
我尝试了所有的方法,但是仍然被这个错误困扰着。 - Fabrizio Bartolomucci

2
另一个解决此问题的方法是检查您是否有两个或更多文件具有相同的文件名。这对我解决了问题。

2

感谢 @Kampai 的建议,让我去查看错误日志信息。我仔细阅读了日志,并发现一些文件丢失:

<unknown>:0: error: no such file or directory:  

在从GitHub拉取代码时,某些文件不知何故被删除了。这些文件在目录中存在,但不在Xcode项目中。

右键单击一个文件夹,然后点击“添加文件到...”手动将缺失的文件添加到Xcode中。这对我解决了问题。

这种情况我已经遇到过好几次了,但现在我知道如何解决它 \o/


1

我在didSet块中包含以下代码时遇到了相同的错误:

didSet {
  // Test whether this view is currently visible to the user.
  if super.isViewLoaded() && (super.view.window != nil) {
    // (build fails even if this block is empty)
  }
}

删除super.后,构建才能继续进行。

类似于这种情况,我的案例是在覆盖属性的set和get方法中调用super。解决此问题的方法是定义一个函数来调用并返回super值,并从自定义getter和setter中调用此函数。 - KoCMoHaBTa
你能为团队做出贡献,将这个问题简化成一个 bug 报告吗?我也遇到了类似的情况,但是我无法在不让 bug 消失的情况下提取它。 - Chris Conover

1

只需删除派生数据和清理即可帮助我


1

为了解决这个bug,我花了3个多小时仔细地从一个文件到另一个文件逐一撤销更改,并查看是否存在问题。我尝试了第一个答案,但没有得到任何答案。后来我发现问题出在我定义了一个与子类计算属性同名的非计算属性。希望调试器在未来更新中能够更好地处理这些情况 :(


0

既然其他人都展示了他们的,那我也来展示我的:

class Foo : UIView {
    var pathPosition:Double = 0.0 { didSet {
        pathPosition = min(max(0.0, pathPosition), 1.0) // crashes if this line is present
        self.pathPosition = min(max(0.0, pathPosition), 1.0) // but not here
        }}
}

令人难以置信的是,这在Playground中没有问题,但在框架代码中却失败了。虽然它是合法的语法(曾经可以工作,在Playground中仍然可以工作),但Swift编译器似乎希望将pathPosition限定为self.。请注意,这是(相对)旧的代码,曾经可以编译,也许在6.1版本中出现了一些问题。

编辑:

我感觉自己快疯了,但似乎存在一个更大的复杂性问题,周围的代码可能会影响到这个问题。昨晚我看到一些编译通过的代码,今天又改了一些代码和设置,结果又失败了。今天,我不得不添加了一堆非常愚蠢的代码才能让它工作:

var pathPosition:Double = 0.0 { didSet {

    // bug: insane!! - have to clobber the value before resetting!
    let bugOldValue = pathPosition
    self.pathPosition = 1.0 // fails without this nonsensical line!
    self.pathPosition = min(max(0.0, bugOldValue), 1.0)
}}

就我所知,根据上面提供的有用指示,我实际收到的错误消息是:

PHI node has multiple entries for the same basic block with different incoming values!
%14 = phi double [ 1.000000e+00, %10 ], [ %11, %10 ], [ 1.000000e+00, %9 ], [ 0.000000e+00, %9 ], !dbg !4818
label %10
double 1.000000e+00
%11 = phi double [ %7, %entry ], !dbg !4815
LLVM ERROR: Broken function found, compilation aborted!

我对明天感到害怕。


我只是用自己的函数替换了min和max函数,并摆脱了那个混乱。 - Raj

0
关于@Kampal,我仍在努力弄清楚在函数调用中需要指定多少内容。例如,创建UIColor对象有时需要指定UIColor,有时则不需要。
这两个都可以:
playButton.backgroundColor = .darkGrayColor()
playButton.setTitleColor(UIColor.whiteColor(), forState: UIControlState.Normal)

编译时会出现退出代码1错误,没有任何调试器警告。 #耗时的调试漩涡

playButton.setTitleColor(.whiteColor(), forState: UIControlState.Normal)  

所以我有一个新规则:当使用需要多个参数的函数时,要明确指出。

现在回到玩swift: AVOID THE VORTEX


至少,“#时间消耗的调试漩涡”让我们在经历这个问题时笑了 :) - Jonathan Crooke

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