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



我刚刚更新了我的Xcode v6, Swift 1, iOS 7.1应用程序到Xcode 7和Swift 2.0使用转换器,并做了一些手动更改,以摆脱所有关于Swift文件的构建错误。但在我解决了所有问题后,我仍然得到了linker command failed with exit code 1

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

  • 删除test-variables
  • 构建中的hosts设置
  • 试图清除所有文件夹和构建,包括派生数据
  • 试图将比特码设置为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)

带有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的问题。你的问题是全局变量是全局的——它们可以被整个程序访问。在头文件中声明这些全局变量会导致在#import作为头文件的每个文件中定义它们,这会使链接器感到困惑,因为相同的常量有67个定义。

你需要把定义移到receiptValidationHelper.m,这样每个常量只有一个全局可访问的副本。

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

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

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

最新更新