我刚刚开始将Android应用程序移植到iOS,尽管遇到了许多类似的问题,但遇到了一个我无法解决的主要障碍。

我正在尝试遵循在CastVideos sample中实现的模式,其中GoogleCast API封装在我称为CastManager的单例类中。要使用我的单例类,我在AppDelegate.m中使用#import "CastManager.h"。然后在CastManager.h中,我使用#import <GoogleCast/GoogleCast.h>,以便可以将其中的类和协议用作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示例中的相关文件以进行比较:
  • ChromecastDeviceController.h
  • ChromecastDeviceController.m
  • AppDelegate.m

  • 其他问题指向不适用或未解决的解决方案:
  • 我不是偶然导入.m文件。
  • 我没有对项目中任何文件的重复引用。
  • “构建阶段”项目设置的“编译源”部分不包含任何重复项。
  • 我添加了“-ObjC”链接器标志,如GoogleCast API文档所述,尽管有或没有它,它都有相同的错误。
  • 我尝试删除委托数据并在构建之前进行清理。
  • 这是在OS X Yosemite 10.10.3上运行的Xcode 6.3.1和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?

    10-08 05:43