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

时间:2015-09-23 23:28:39

标签: ios linker-errors swift2 xcode7

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

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

  • 删除测试变量构建中的主机设置
  • 尝试清理所有文件夹和构建,包括派生数据
  • 试图将Bitcode设为NO
  • {li}已完成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代码中使用了这个常量。我使用toolbox-Bridging-Header.h

#import <receiptValidationHelper.h>中导入了.h文件

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

编辑: 如果我删除了Swift代码中global_bundleIdentifier的所有用法,则错误消失了!在Swift 2.0中似乎有一些关于使用Objective-C代码变量的新东西。现在有人正是我要改变的吗?

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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