我刚刚更新了我的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
指令告诉编译器,"嘿,这些常量是在其他地方定义的。"然后,编译器就像它们存在一样,让链接器来处理它们。