我刚刚开始将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示例中的相关文件以进行比较:
其他问题指向不适用或未解决的解决方案:
.m
文件。 我已经在https://github.com/nshafer/MyCastApp中检查了示例项目中的问题
任何帮助是极大的赞赏!
编辑:重复项有些相关,它肯定是关于相同的符号,但是那里的答案没有帮助,因为我没有使用Object-C++,而是使用Objective-C。我没有.mm文件,只有.m文件。
最佳答案
对我来说,这有助于将“No Common Blocks”编译器设置切换为NO:
似乎很有道理,在此处解释了该设置:What is GCC_NO_COMMON_BLOCKS used for?