GoogleCast.framework 的重复符号错误
Duplicate symbol error with GoogleCast.framework
我刚开始将 Android 应用程序移植到 iOS,但遇到了一个主要障碍,尽管搜索了许多类似的问题,但我还是无法弄清楚。
我正在尝试遵循 CastVideos sample 中实施的模式,其中 GoogleCast API 封装在我称之为 CastManager
的单例 class 中。为了使用我的单例 class,我 #import "CastManager.h"
在 AppDelegate.m 中。然后在 CastManager.h 中,我 #import <GoogleCast/GoogleCast.h>
以便我可以使用其中的 classes 和协议作为 CastManager 的 public 接口的一部分。但是,因为我在 CastManager.m 和 AppDelegate.m 中都导入了 CastManager.h,链接器正在从 GoogleCast 框架中查找重复的符号。
这是我的 CastManager.h:
#import <GoogleCast/GoogleCast.h>
#import <Foundation/Foundation.h>
@interface CastManager : NSObject
@property(nonatomic, strong) GCKDeviceScanner *deviceScanner;
+ (instancetype)sharedCastManager;
@end
对应CastManager.m:
#import "CastManager.h"
@implementation CastManager
+ (instancetype)sharedCastManager {
NSLog(@"sharedCastManager");
static CastManager *singleton = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
singleton = [[self alloc] init];
});
return singleton;
}
- (instancetype)init {
NSLog(@"init()");
if (self = [super init]) {
self.deviceScanner = [[GCKDeviceScanner alloc] init];
}
return self;
}
@end
这是我的主要部分 AppDelegate.m:
#import "AppDelegate.h"
#import "CastManager.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
CastManager *castManager = [CastManager sharedCastManager];
return YES;
}
但是,这会导致链接器在尝试构建项目时出现以下错误:
duplicate symbol _kGCKDeviceCapabilityVideoOut in:
/Users/nate/Library/Developer/Xcode/DerivedData/MyCastApp-ezrgxdnlvywpanerezulnarzknno/Build/Intermediates/MyCastApp.build/Debug-iphonesimulator/MyCastApp.build/Objects-normal/x86_64/AppDelegate.o
/Users/nate/Library/Developer/Xcode/DerivedData/MyCastApp-ezrgxdnlvywpanerezulnarzknno/Build/Intermediates/MyCastApp.build/Debug-iphonesimulator/MyCastApp.build/Objects-normal/x86_64/CastManager.o
... many similar errors ommitted for brevity ...
duplicate symbol _kGCKDeviceCapabilityAudioIn in:
/Users/nate/Library/Developer/Xcode/DerivedData/MyCastApp-ezrgxdnlvywpanerezulnarzknno/Build/Intermediates/MyCastApp.build/Debug-iphonesimulator/MyCastApp.build/Objects-normal/x86_64/AppDelegate.o
/Users/nate/Projects/MyCastApp/GoogleCast.framework/GoogleCast(GCKDevice.o)
ld: 8 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
据我所知,这完全复制了 CastVideos 样本中定义的模式,但该样本编译正常,而我的则没有,我已经搜索了这两个项目,试图找出不同之处,但我只是看不到它。此外,我没有看到这样做有什么真正的问题,并且希望它能正常工作。我想不出任何其他方法,真的。
以下是 CastVideos 示例中的相关文件以供比较:
其他问题指向不适用或不修复它的解决方案:
- 我不是无意中导入了
.m
文件。
- 我没有对项目中任何文件的重复引用。
- "Build Phases" 项目设置的 "Compile Sources" 部分不包含任何重复项。
- 我已经按照 GoogleCast API 文档中的描述添加了“-ObjC”链接器标志,尽管无论有无它都会出现相同的错误。
- 我试过删除委托数据并在构建之前进行清理。
- 这是 Xcode 6.3.1 运行 on OS X Yosemite 10.10.3 和来自 the SDK documentation page 的 GoogleCastSDK-2.6.0 包
我已经在 https://github.com/nshafer/MyCastApp
处检查了我的示例项目中的问题
非常感谢任何帮助!
编辑:副本有点相关,它肯定是关于相同的符号,但那里的答案没有帮助,因为我没有使用 Object-C++,而只是 Objective-C。我没有 .mm 文件,只有 .m 文件。
对我来说,将 "No Common Blocks" 编译器设置切换为 NO:
很有帮助
这似乎很有道理,这里解释了设置:What is GCC_NO_COMMON_BLOCKS used for?
链接器告诉您在两个文件 AppDelegate.m 和 CastManager.m 中有一个名为 kGCKDeviceCapabilityVideoOut 的变量。由于它不在您的源代码中,因此很可能在您包含的 GoogleCast 代码中。
要么更改 GoogleCast.h 文件,要么确保它只包含在一个 .m 文件中。从 CastManager.h 中包含它意味着它间接包含在每个包含 CastManager.h 的文件中,所以我会避免这种情况,只从 CastManager.m 中包含它。您可能需要添加
@class GCKDeviceScanner;
在您的 CastManager.h 文件中。
我找到了另一个修复方法,即编辑 GoogleCast.framework/Headers 文件夹中的 GCKDevice.h。将文件顶部附近的 4 个常量从 GCK_EXPORT
更改为 GCK_EXTERN
。
/** Device capability flag for video out. */
GCK_EXTERN const NSInteger kGCKDeviceCapabilityVideoOut;
/** Device capability flag for video in. */
GCK_EXTERN const NSInteger kGCKDeviceCapabilityVideoIn;
/** Device capability flag for audio out. */
GCK_EXTERN const NSInteger kGCKDeviceCapabilityAudioOut;
/** Device capability flag for audio in. */
GCK_EXTERN const NSInteger kGCKDeviceCapabilityAudioIn;
我在提交给 Google 的问题跟踪器的 bug report 中对此进行了详细说明,但它被标记为另一个有点相关的问题的副本。不管怎样,它可能会在下一个版本中得到修复。在那之前,我建议按照 Joobik'com 的回答中的详细说明更改 "No Common Blocks" 设置,因为这不涉及更改第 3 方代码。
我刚开始将 Android 应用程序移植到 iOS,但遇到了一个主要障碍,尽管搜索了许多类似的问题,但我还是无法弄清楚。
我正在尝试遵循 CastVideos sample 中实施的模式,其中 GoogleCast API 封装在我称之为 CastManager
的单例 class 中。为了使用我的单例 class,我 #import "CastManager.h"
在 AppDelegate.m 中。然后在 CastManager.h 中,我 #import <GoogleCast/GoogleCast.h>
以便我可以使用其中的 classes 和协议作为 CastManager 的 public 接口的一部分。但是,因为我在 CastManager.m 和 AppDelegate.m 中都导入了 CastManager.h,链接器正在从 GoogleCast 框架中查找重复的符号。
这是我的 CastManager.h:
#import <GoogleCast/GoogleCast.h>
#import <Foundation/Foundation.h>
@interface CastManager : NSObject
@property(nonatomic, strong) GCKDeviceScanner *deviceScanner;
+ (instancetype)sharedCastManager;
@end
对应CastManager.m:
#import "CastManager.h"
@implementation CastManager
+ (instancetype)sharedCastManager {
NSLog(@"sharedCastManager");
static CastManager *singleton = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
singleton = [[self alloc] init];
});
return singleton;
}
- (instancetype)init {
NSLog(@"init()");
if (self = [super init]) {
self.deviceScanner = [[GCKDeviceScanner alloc] init];
}
return self;
}
@end
这是我的主要部分 AppDelegate.m:
#import "AppDelegate.h"
#import "CastManager.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
CastManager *castManager = [CastManager sharedCastManager];
return YES;
}
但是,这会导致链接器在尝试构建项目时出现以下错误:
duplicate symbol _kGCKDeviceCapabilityVideoOut in:
/Users/nate/Library/Developer/Xcode/DerivedData/MyCastApp-ezrgxdnlvywpanerezulnarzknno/Build/Intermediates/MyCastApp.build/Debug-iphonesimulator/MyCastApp.build/Objects-normal/x86_64/AppDelegate.o
/Users/nate/Library/Developer/Xcode/DerivedData/MyCastApp-ezrgxdnlvywpanerezulnarzknno/Build/Intermediates/MyCastApp.build/Debug-iphonesimulator/MyCastApp.build/Objects-normal/x86_64/CastManager.o
... many similar errors ommitted for brevity ...
duplicate symbol _kGCKDeviceCapabilityAudioIn in:
/Users/nate/Library/Developer/Xcode/DerivedData/MyCastApp-ezrgxdnlvywpanerezulnarzknno/Build/Intermediates/MyCastApp.build/Debug-iphonesimulator/MyCastApp.build/Objects-normal/x86_64/AppDelegate.o
/Users/nate/Projects/MyCastApp/GoogleCast.framework/GoogleCast(GCKDevice.o)
ld: 8 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
据我所知,这完全复制了 CastVideos 样本中定义的模式,但该样本编译正常,而我的则没有,我已经搜索了这两个项目,试图找出不同之处,但我只是看不到它。此外,我没有看到这样做有什么真正的问题,并且希望它能正常工作。我想不出任何其他方法,真的。
以下是 CastVideos 示例中的相关文件以供比较:
其他问题指向不适用或不修复它的解决方案:
- 我不是无意中导入了
.m
文件。 - 我没有对项目中任何文件的重复引用。
- "Build Phases" 项目设置的 "Compile Sources" 部分不包含任何重复项。
- 我已经按照 GoogleCast API 文档中的描述添加了“-ObjC”链接器标志,尽管无论有无它都会出现相同的错误。
- 我试过删除委托数据并在构建之前进行清理。
- 这是 Xcode 6.3.1 运行 on OS X Yosemite 10.10.3 和来自 the SDK documentation page 的 GoogleCastSDK-2.6.0 包
我已经在 https://github.com/nshafer/MyCastApp
处检查了我的示例项目中的问题非常感谢任何帮助!
编辑:副本有点相关,它肯定是关于相同的符号,但那里的答案没有帮助,因为我没有使用 Object-C++,而只是 Objective-C。我没有 .mm 文件,只有 .m 文件。
对我来说,将 "No Common Blocks" 编译器设置切换为 NO:
很有帮助这似乎很有道理,这里解释了设置:What is GCC_NO_COMMON_BLOCKS used for?
链接器告诉您在两个文件 AppDelegate.m 和 CastManager.m 中有一个名为 kGCKDeviceCapabilityVideoOut 的变量。由于它不在您的源代码中,因此很可能在您包含的 GoogleCast 代码中。
要么更改 GoogleCast.h 文件,要么确保它只包含在一个 .m 文件中。从 CastManager.h 中包含它意味着它间接包含在每个包含 CastManager.h 的文件中,所以我会避免这种情况,只从 CastManager.m 中包含它。您可能需要添加
@class GCKDeviceScanner;
在您的 CastManager.h 文件中。
我找到了另一个修复方法,即编辑 GoogleCast.framework/Headers 文件夹中的 GCKDevice.h。将文件顶部附近的 4 个常量从 GCK_EXPORT
更改为 GCK_EXTERN
。
/** Device capability flag for video out. */
GCK_EXTERN const NSInteger kGCKDeviceCapabilityVideoOut;
/** Device capability flag for video in. */
GCK_EXTERN const NSInteger kGCKDeviceCapabilityVideoIn;
/** Device capability flag for audio out. */
GCK_EXTERN const NSInteger kGCKDeviceCapabilityAudioOut;
/** Device capability flag for audio in. */
GCK_EXTERN const NSInteger kGCKDeviceCapabilityAudioIn;
我在提交给 Google 的问题跟踪器的 bug report 中对此进行了详细说明,但它被标记为另一个有点相关的问题的副本。不管怎样,它可能会在下一个版本中得到修复。在那之前,我建议按照 Joobik'com 的回答中的详细说明更改 "No Common Blocks" 设置,因为这不涉及更改第 3 方代码。