我刚刚使用转换器将我的Xcode v6,Swift 1,iOS 7.1应用程序更新为Xcode 7和Swift 2.0,并进行了一些手动更改以消除有关swift文件的所有构建错误。
但在我解决了所有问题后,我仍然得到linker command failed with exit code 1
......
我已尝试过我能在网上找到的所有解决方案,包括:
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代码变量的新东西。现在有人正是我要改变的吗?
答案 0 :(得分:3)
这是一个C问题,而不是Swift问题。您的问题是全局变量是全局变量 - 它们可以被整个程序访问。在标头中声明这些全局变量会导致它们在#import
标题的每个文件中定义,从而使链接器混乱,因为有67个相同常量的定义。
您需要将定义移至receiptValidationHelper.m
,以便每个常量只有一个可全局访问的副本。
但是,如果您只是将常量移动到.m,编译器会在您尝试使用它们的任何地方进行投诉,因为它找不到它们,因此请将这些行添加到receiptValidationHelper.h
:
extern const NSString *global_bundleVersion;
extern const NSString *global_bundleIdentifier;
extern
指令告诉编译器,“嘿,这些常量是在其他地方定义的。”然后编译器就像它们存在一样,让链接器处理它。