Xcode 7,Swift 2.0 转换:"duplicate symbol" 和链接器命令失败,退出代码为 1

Xcode 7, Swift 2.0 conversion: "duplicate symbol" and linker command failed with exit code 1

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

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

以上都没有解决问题。

几次警告后显示的 link 错误是:

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)

带有 global_bundleidentifier 的代码就在 receiptValidationHelper.h 中,看起来像这样

const NSString *global_bundleVersion = @"1";
const NSString *global_bundleIdentifier = @"xxxx";

如上所述,我的应用程序是 Swift,我也在 swift 代码中使用了这个常量。我使用 #import <receiptValidationHelper.h>

toolbox-Bridging-Header.h 中导入了 .h 文件

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

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

这是 C 语言问题,而不是 Swift。您的问题是全局变量是全局的——它们可以被整个程序访问。在 header 中声明这些全局变量会导致在 #import 和 header 的每个文件中定义它们,这会混淆链接器,因为相同常量有 67 个定义。

您需要将定义移动到 receiptValidationHelper.m,这样每个常量只有一个 globally-accessible 副本。

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

extern const NSString *global_bundleVersion;
extern const NSString *global_bundleIdentifier;

extern 指令告诉编译器,"hey, these constants are defined somewhere else." 编译器然后像它们存在一样工作,让链接器处理它。