0

我正在尝试使用 GData ObjC 库将视频从 iPhone 上传到 Youtube。

当我在添加库后尝试构建我的项目时(此处显示: svn checkout http://gdata-objectivec-client.googlecode.com/svn/trunk/gdata-objectivec-client-read-only),我不断得到错误 - GDataServiceBase.m 中类“GDataHTTPUploadFetcher”的重复接口定义

但是,当我在一个新项目中做同样的事情时,我根本不会遇到任何问题。我检查了所有的导入和项目设置,它们都是一样的。

我应该寻找什么来解决这样的问题?


附加信息 :

(在评论中回答 Till 的问题之一,因为我对类别不确定)

GDataHTTPUploadFetcher.h中,界面是这样的:

@interface GDataHTTPUploadFetcher : GDataHTTPFetcher {

GDataHTTPFetcher *chunkFetcher_;
BOOL needsManualProgress_
NSURL *locationURL_;
// uploadData_ or uploadFileHandle_ may be set, but not both
NSData *uploadData_;
NSFileHandle *uploadFileHandle_;
NSInteger uploadFileHandleLength_;
NSString *uploadMIMEType_;
NSUInteger chunkSize_;
BOOL isPaused_;

.
.
.

}

+ (GDataHTTPUploadFetcher *)uploadFetcherWithRequest:(NSURLRequest *)request
                                      uploadData:(NSData *)data
                                  uploadMIMEType:(NSString *)uploadMIMEType
                                       chunkSize:(NSUInteger)chunkSize;

+ (GDataHTTPUploadFetcher *)uploadFetcherWithRequest:(NSURLRequest *)request
                                uploadFileHandle:(NSFileHandle *)fileHandle
                                  uploadMIMEType:(NSString *)uploadMIMEType
                                       chunkSize:(NSUInteger)chunkSize;

- (id)initWithRequest:(NSURLRequest *)request
       uploadData:(NSData *)data
 uploadFileHandle:(NSFileHandle *)fileHandle
   uploadMIMEType:(NSString *)uploadMIMEType
        chunkSize:(NSUInteger)chunkSize;

- (void)pauseFetching;
- (void)resumeFetchingWithDelegate:(id)delegate;
- (BOOL)isPaused;



@end

GDataHTTPUploadFetcher.m中,界面是这样的:

@interface GDataHTTPUploadFetcher (InternalMethods)
- (void)uploadNextChunkWithOffset:(NSUInteger)offset;
- (void)uploadNextChunkWithOffset:(NSUInteger)offset
            fetcherProperties:(NSDictionary *)props;
- (void)destroyChunkFetcher;

- (void)uploadFetcher:(GDataHTTPFetcher *)fetcher
     didSendBytes:(NSInteger)bytesSent
   totalBytesSent:(NSInteger)totalBytesSent
totalBytesExpectedToSend:(NSInteger)totalBytesExpected;

- (void)reportProgressManually;

- (NSUInteger)fullUploadLength;

// private methods of the superclass
- (void)invokeSentDataCallback:(SEL)sel
                    target:(id)target
           didSendBodyData:(NSInteger)bytesWritten
         totalBytesWritten:(NSInteger)totalBytesWritten
 totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite;

- (void)invokeStatusCallback:(SEL)sel
                  target:(id)target
                  status:(NSInteger)status
                    data:(NSData *)data;

- (BOOL)invokeRetryCallback:(SEL)sel
                 target:(id)target
              willRetry:(BOOL)willRetry
                  error:(NSError *)error;
@end

GDataServiceBase.m中,接口是这样的:

@interface GDataHTTPUploadFetcher : GDataHTTPFetcher
+ (GDataHTTPUploadFetcher *)uploadFetcherWithRequest:(NSURLRequest *)request
                                      uploadData:(NSData *)data
                                  uploadMIMEType:(NSString *)uploadMIMEType
                                       chunkSize:(NSUInteger)chunkSize;
+ (GDataHTTPUploadFetcher *)uploadFetcherWithRequest:(NSURLRequest *)request
                                uploadFileHandle:(NSFileHandle *)uploadFileHandle
                                  uploadMIMEType:(NSString *)uploadMIMEType
                                       chunkSize:(NSUInteger)chunkSize;
- (void)pauseFetching;
- (void)resumeFetchingWithDelegate:(id)delegate;
- (BOOL)isPaused;
@end

但问题是,这段代码只会在现有项目之一中产生问题,而不会在新项目中产生问题。

4

2 回答 2

0

检查您的Target -> Build Phases -> Compile Sources是否可能包含GDataServiceBase.m两次。如果是这样,请从该列表中删除一个参考。

在此处输入图像描述

还要彻底检查所有导入/包含,看看它们是否可能包含实现文件 ( .m)。全球搜索GDataServiceBase.m将完成这项工作。

也许您在标题中的某个地方使用了 an#include而不是 an 。#import现在,如果您这样做,#include包含该标头的标头或实现文件中的另一个相同标头将导致双重定义。#import即使没有保护定义也可以完美地工作,而#include需要那些来防止双重定义。

发布代码后,它变得很明显。您引用的那些来源显然是对同一类的双重定义。我只能猜测其中的原因;直截了当的糟糕设计


最后,原因

显然GDataServiceBase.m以及GDataHTTPUploadFetcher.h定义相同的类:GDataHTTPUploadFetcher. 这当然没有意义。我无法回答作者为什么这样做,也许它只是一个过时的实现文件,不应该再编译了。无论如何,只需删除整个@interface块, GDataServiceBase.m直到并包括第一个@end. 第三个接口定义(内部GDataHTTPUploadFetcher.m)实际上定义了一个类别 - 您可以看到它,因为它在类/类别名称后面包含括号(InternalMethods)。顺便说一句,原作者不应该命名它们InternalMethods,而只是打开和关闭括号()。但这里的一切都是他的错,不是你的:D。

于 2012-04-29T09:37:38.677 回答
0

我不得不将所有代码移到一个新项目中,然后一切正常。

显然,我在项目设置中搞砸了一些东西。

非常感谢大家的帮助。

于 2012-05-24T22:26:26.250 回答