Xcode 7、Swift 2.0 转换:“重复符号”和链接器命令失败,退出代码 1

Sok*_*oko 3 linker-errors ios xcode7 swift2

我刚刚使用转换器将我的 Xcode v6、Swift 1、iOS 7.1 应用程序更新为 Xcode 7 和 Swift 2.0,并进行了一些手动更改以消除与 swift 文件相关的所有构建错误。linker command failed with exit code 1但在解决所有问题后我仍然得到一个...

我已经尝试了在网上可以找到的所有解决方案,包括:

  • 删除测试变量构建中的主机设置
  • 尝试清理所有文件夹和构建,包括派生数据
  • 尝试将 Bitcode 设置为 NO
  • toolbox-Bridging-Header.h我已经完成的#import <receiptValidationHelper.h>而不是 .m 文件中

以上都没有解决问题。

一些警告后显示的链接错误是:

duplicate symbol _global_bundleIdentifier in:
/Users/soko/Library/Developer/Xcode/DerivedData/toolbox-bpiaqlzxdtrbqwekzouzpbfnqxaa/Build/Intermediates/toolbox.build/Debug-iphonesimulator/toolbox.build/Objects-normal/x86_64/receiptValidationHelper.o
/Users/soko/Library/Developer/Xcode/DerivedData/toolbox-bpiaqlzxdtrbqwekzouzpbfnqxaa/Build/Intermediates/toolbox.build/Debug-iphonesimulator/toolbox.build/Objects-normal/x86_64/SwashTypeController.o
....
ld: 67 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)

带有 的代码global_bundleidentifier看起来receiptValidationHelper.h像这样

const NSString *global_bundleVersion = @"1";
const NSString *global_bundleIdentifier = @"xxxx";
Run Code Online (Sandbox Code Playgroud)

如上所述,我的应用程序是 Swift,我也在 swift 代码中使用这个常量。toolbox-Bridging-Header.h我在using中导入了 .h 文件#import <receiptValidationHelper.h>

我还尝试重命名const NSString *global_bundleIdentifier = @"xxx";,这会导致新名称出现相同的错误。

编辑:如果我删除 Swift 代码中的所有用法,global_bundleIdentifier错误就会消失!Swift 2.0 中关于 Objective-C 代码变量的使用似乎是新的。现在有人知道我必须改变什么吗?

Nob*_*ica 5

这是一个 C 问题,而不是 Swift 问题。你的问题是全局变量是全局的——它们可以被整个程序访问。在标头中声明这些全局变量会导致它们在作为标头的每个文件中定义#import,从而使链接器感到困惑,因为相同常量有 67 个定义。

您需要移动定义,receiptValidationHelper.m以便每个常量只有一个全局可访问的副本。

但是,如果您只是将常量移动到 .m,编译器会在您尝试使用它们的任何地方抱怨,因为它找不到它们,因此将这些行添加到receiptValidationHelper.h

extern const NSString *global_bundleVersion;
extern const NSString *global_bundleIdentifier;
Run Code Online (Sandbox Code Playgroud)

这些extern指令告诉编译器,“嘿,这些常量是在其他地方定义的。” 然后编译器的行为就像它们存在一样,让链接器处理它。