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
...
我已经尝试了所有可以在网上找到的解决方案,包括:
- 删除测试变量构建中的主机设置
- 已尝试清理所有文件夹和构建,包括派生数据
- 试图将 Bitcode 设置为 NO
- 在
toolbox-Bridging-Header.h
我已经完成 #import <receiptValidationHelper.h>
而不是 .m 文件
以上都没有解决问题。
几次警告后显示的 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." 编译器然后像它们存在一样工作,让链接器处理它。
我刚刚使用转换器将 Xcode v6、Swift 1、iOS 7.1 应用程序更新为 Xcode 7 和 Swift 2.0,并且进行一些手动更改以消除与 swift 文件有关的所有构建错误。
但在我解决了所有问题后,我仍然得到 linker command failed with exit code 1
...
我已经尝试了所有可以在网上找到的解决方案,包括:
- 删除测试变量构建中的主机设置
- 已尝试清理所有文件夹和构建,包括派生数据
- 试图将 Bitcode 设置为 NO
- 在
toolbox-Bridging-Header.h
我已经完成#import <receiptValidationHelper.h>
而不是 .m 文件
以上都没有解决问题。
几次警告后显示的 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." 编译器然后像它们存在一样工作,让链接器处理它。