使用GoogleCast.framework重复出现符号错误

Nii*_*mus 2 xcode mach-o objective-c ios google-cast

我刚刚开始将一个Android应用程序移植到iOS上,并且遇到了一个主要的障碍,尽管我在搜索许多类似的问题时仍然无法弄清楚.

我试图遵循CastVideos示例中实现的模式,其中GoogleCast API封装在我调用的单例类中CastManager.要使用我的单例类,我#import "CastManager.h"在AppDelegate.m中.然后在CastManager.h中,我#import <GoogleCast/GoogleCast.h>可以使用它的类和协议作为CastManager的公共接口的一部分.但是,因为我在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
Run Code Online (Sandbox Code Playgroud)

和相应的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
Run Code Online (Sandbox Code Playgroud)

这是我的AppDelegate.m的主要部分:

#import "AppDelegate.h"
#import "CastManager.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    CastManager *castManager = [CastManager sharedCastManager];
    return YES;
}
Run Code Online (Sandbox Code Playgroud)

但是,这会在尝试构建项目时导致链接器出现以下错误:

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)
Run Code Online (Sandbox Code Playgroud)

据我所知,这完全复制了CastVideos样本中定义的模式,但样本编译得很好,我的没有,我已经仔细研究了两个项目,试图找到不同的东西,但我只是不喜欢看不到.此外,我没有看到这样做有什么问题,并期望它能正常工作.真的,我想不出任何其他办法.

以下是CastVideos示例中的相关文件以供比较:

其他问题指向不适用或不解决的解决方案:

  • 我没有.m意外导入文件.
  • 我没有对项目中任何文件的重复引用.
  • "构建阶段"项目设置的"编译源"部分不包含任何重复项.
  • 我已经添加了'-ObjC'链接器标志,如GoogleCast API文档所述,尽管它有或没有相同的错误.
  • 我已经尝试删除代理数据并在构建之前进行清理.
  • 这是在OS X Yosemite 10.10.3上运行的Xcode 6.3.1和从SDK文档页面运行的GoogleCastSDK-2.6.0软件包

我已经通过https://github.com/nshafer/MyCastApp检查了我的示例项目中的问题

任何帮助是极大的赞赏!

编辑:副本有点相关,它肯定是相同的符号,但那里的答案没有帮助,因为我没有使用Object-C++,而只是Objective-C.我没有.mm文件,只有一个.m文件.

小智 7

对我来说,它有助于将"No Common Blocks"编译器设置切换为NO:

在此输入图像描述

它似乎很有意义,这里解释了设置:GCC_NO_COMMON_BLOCKS用于什么?