2010-06-27 63 views
6

我最近升级到iOS4 SDK和我的应用程序不再编译为模拟器,但确实为设备编译libGoogleAnalytics.a链接问题与iPhone iOS4模拟器

这是由于第三方库libGoogleAnalytics.a。该解决方案似乎是为了发布一个新的符合新SDK的静态库,遗憾的是没有任何发布日期,并且由于新的SDK许可,他们可能永远不会发布新的库。

http://www.google.com/support/forum/p/Google+Analytics/thread?tid=0e35876711dc99b1&hl=en

我正在以下编译错误:

Undefined symbols: 
    ".objc_class_name_NSObject", referenced from: 
     .objc_class_name_GANTCPSocket in libGoogleAnalytics.a(GANTCPSocket.o) 
     .objc_class_name_GTMLogger in libGoogleAnalytics.a(GTMLogger.o) 
     .objc_class_name_GTMLogBasicFormatter in libGoogleAnalytics.a(GTMLogger.o) 
     .objc_class_name_GTMLogLevelFilter in libGoogleAnalytics.a(GTMLogger.o) 
     .objc_class_name_GTMLogNoFilter in libGoogleAnalytics.a(GTMLogger.o) 
     .objc_class_name_GTMLogASLWriter in libGoogleAnalytics.a(GTMLogger+ASL.o) 
     .objc_class_name_GTMLoggerASLClient in libGoogleAnalytics.a(GTMLogger+ASL.o) 
     .objc_class_name_GANDataDispatcher in libGoogleAnalytics.a(GANDataDispatcher.o) 
     .objc_class_name_GANHTTPResponseParser in libGoogleAnalytics.a(GANHTTPResponseParser.o) 
     .objc_class_name_GANEvent in libGoogleAnalytics.a(GANEvent.o) 
     .objc_class_name_GTMLoggerRingBufferWriter in libGoogleAnalytics.a(GTMLoggerRingBufferWriter.o) 
     .objc_class_name_GANTracker in libGoogleAnalytics.a(GANTracker.o) 
     .objc_class_name_GANPersistentEventStore in libGoogleAnalytics.a(GANPersistentEventStore.o) 
    ".objc_class_name_NSFileManager", referenced from: 
     [email protected][email protected][email protected] in libGoogleAnalytics.a(GANPersistentEventStore.o) 
    ".objc_class_name_NSString", referenced from: 
     [email protected][email protected][email protected] in libGoogleAnalytics.a(GTMLogger.o) 
     [email protected][email protected][email protected] in libGoogleAnalytics.a(GANTracker.o) 
     [email protected][email protected][email protected] in libGoogleAnalytics.a(GANPersistentEventStore.o) 
    ".objc_class_name_NSError", referenced from: 
     [email protected][email protected][email protected] in libGoogleAnalytics.a(GANTracker.o) 
     [email protected][email protected][email protected] in libGoogleAnalytics.a(GANPersistentEventStore.o) 
    ".objc_class_name_NSFileHandle", referenced from: 
     [email protected][email protected][email protected] in libGoogleAnalytics.a(GTMLogger.o) 
    ".objc_class_name_NSMutableString", referenced from: 
     [email protected][email protected][email protected] in libGoogleAnalytics.a(GANDataDispatcher.o) 
    ".objc_class_name_NSTimer", referenced from: 
     [email protected][email protected][email protected] in libGoogleAnalytics.a(GANTracker.o) 
    ".objc_class_name_NSMutableArray", referenced from: 
     [email protected][email protected][email protected] in libGoogleAnalytics.a(GANDataDispatcher.o) 
     [email protected][email protected][email protected] in libGoogleAnalytics.a(GANPersistentEventStore.o) 
    ".objc_class_name_UIScreen", referenced from: 
     [email protected][email protected][email protected] in libGoogleAnalytics.a(GANDataDispatcher.o) 
    ".objc_class_name_NSProcessInfo", referenced from: 
     [email protected][email protected][email protected] in libGoogleAnalytics.a(GTMLogger.o) 
    "_objc_exception_extract", referenced from: 
     +[GTMLogger sharedLogger] in libGoogleAnalytics.a(GTMLogger.o) 
     +[GTMLogger setSharedLogger:] in libGoogleAnalytics.a(GTMLogger.o) 
     -[GTMLogger setWriter:] in libGoogleAnalytics.a(GTMLogger.o) 
     -[GTMLogger setFormatter:] in libGoogleAnalytics.a(GTMLogger.o) 
     -[GTMLogger setFilter:] in libGoogleAnalytics.a(GTMLogger.o) 
     -[NSFileHandle(GTMFileHandleLogWriter) logMessage:level:] in libGoogleAnalytics.a(GTMLogger.o) 
     -[NSArray(GTMArrayCompositeLogWriter) logMessage:level:] in libGoogleAnalytics.a(GTMLogger.o) 
     -[GTMLogStandardFormatter stringForFunc:withFormat:valist:level:] in libGoogleAnalytics.a(GTMLogger.o) 
     -[GTMLoggerRingBufferWriter count] in libGoogleAnalytics.a(GTMLoggerRingBufferWriter.o) 
     -[GTMLoggerRingBufferWriter droppedLogCount] in libGoogleAnalytics.a(GTMLoggerRingBufferWriter.o) 
     -[GTMLoggerRingBufferWriter reset] in libGoogleAnalytics.a(GTMLoggerRingBufferWriter.o) 
     -[GTMLoggerRingBufferWriter dumpContents] in libGoogleAnalytics.a(GTMLoggerRingBufferWriter.o) 
     -[GTMLoggerRingBufferWriter logMessage:level:] in libGoogleAnalytics.a(GTMLoggerRingBufferWriter.o) 
     +[GANTracker sharedTracker] in libGoogleAnalytics.a(GANTracker.o) 
     +[GANTracker allocWithZone:] in libGoogleAnalytics.a(GANTracker.o) 
     -[GANTracker startTrackerWithAccountID:dispatchPeriod:delegate:] in libGoogleAnalytics.a(GANTracker.o) 
     -[GANTracker trackPageview:withError:] in libGoogleAnalytics.a(GANTracker.o) 
     -[GANTracker trackEvent:action:label:value:withError:] in libGoogleAnalytics.a(GANTracker.o) 
     -[GANTracker stopTracker] in libGoogleAnalytics.a(GANTracker.o) 
     -[GANTracker dispatch] in libGoogleAnalytics.a(GANTracker.o) 
    ".objc_class_name_NSDate", referenced from: 
     [email protected][email protected][email protected] in libGoogleAnalytics.a(GTMLogger.o) 
     [email protected][email protected][email protected] in libGoogleAnalytics.a(GANPersistentEventStore.o) 
    ".objc_class_name_UIDevice", referenced from: 
     [email protected][email protected][email protected] in libGoogleAnalytics.a(GANDataDispatcher.o) 
    "_objc_exception_try_exit", referenced from: 
     +[GTMLogger sharedLogger] in libGoogleAnalytics.a(GTMLogger.o) 
     +[GTMLogger setSharedLogger:] in libGoogleAnalytics.a(GTMLogger.o) 
     -[GTMLogger setWriter:] in libGoogleAnalytics.a(GTMLogger.o) 
     -[GTMLogger setFormatter:] in libGoogleAnalytics.a(GTMLogger.o) 
     -[GTMLogger setFilter:] in libGoogleAnalytics.a(GTMLogger.o) 
     -[NSFileHandle(GTMFileHandleLogWriter) logMessage:level:] in libGoogleAnalytics.a(GTMLogger.o) 
     -[NSArray(GTMArrayCompositeLogWriter) logMessage:level:] in libGoogleAnalytics.a(GTMLogger.o) 
     -[GTMLogStandardFormatter stringForFunc:withFormat:valist:level:] in libGoogleAnalytics.a(GTMLogger.o) 
     -[GTMLoggerRingBufferWriter count] in libGoogleAnalytics.a(GTMLoggerRingBufferWriter.o) 
     -[GTMLoggerRingBufferWriter droppedLogCount] in libGoogleAnalytics.a(GTMLoggerRingBufferWriter.o) 
     -[GTMLoggerRingBufferWriter reset] in libGoogleAnalytics.a(GTMLoggerRingBufferWriter.o) 
     -[GTMLoggerRingBufferWriter dumpContents] in libGoogleAnalytics.a(GTMLoggerRingBufferWriter.o) 
     -[GTMLoggerRingBufferWriter logMessage:level:] in libGoogleAnalytics.a(GTMLoggerRingBufferWriter.o) 
     +[GANTracker sharedTracker] in libGoogleAnalytics.a(GANTracker.o) 
     +[GANTracker allocWithZone:] in libGoogleAnalytics.a(GANTracker.o) 
     -[GANTracker startTrackerWithAccountID:dispatchPeriod:delegate:] in libGoogleAnalytics.a(GANTracker.o) 
     -[GANTracker trackPageview:withError:] in libGoogleAnalytics.a(GANTracker.o) 
     -[GANTracker trackEvent:action:label:value:withError:] in libGoogleAnalytics.a(GANTracker.o) 
     -[GANTracker stopTracker] in libGoogleAnalytics.a(GANTracker.o) 
     -[GANTracker dispatch] in libGoogleAnalytics.a(GANTracker.o) 
    ".objc_class_name_NSDateFormatter", referenced from: 
     [email protected][email protected][email protected] in libGoogleAnalytics.a(GTMLogger.o) 
    "_objc_exception_try_enter", referenced from: 
     +[GTMLogger sharedLogger] in libGoogleAnalytics.a(GTMLogger.o) 
     +[GTMLogger setSharedLogger:] in libGoogleAnalytics.a(GTMLogger.o) 
     -[GTMLogger setWriter:] in libGoogleAnalytics.a(GTMLogger.o) 
     -[GTMLogger setFormatter:] in libGoogleAnalytics.a(GTMLogger.o) 
     -[GTMLogger setFilter:] in libGoogleAnalytics.a(GTMLogger.o) 
     -[NSFileHandle(GTMFileHandleLogWriter) logMessage:level:] in libGoogleAnalytics.a(GTMLogger.o) 
     -[NSArray(GTMArrayCompositeLogWriter) logMessage:level:] in libGoogleAnalytics.a(GTMLogger.o) 
     -[GTMLogStandardFormatter stringForFunc:withFormat:valist:level:] in libGoogleAnalytics.a(GTMLogger.o) 
     -[GTMLoggerRingBufferWriter count] in libGoogleAnalytics.a(GTMLoggerRingBufferWriter.o) 
     -[GTMLoggerRingBufferWriter droppedLogCount] in libGoogleAnalytics.a(GTMLoggerRingBufferWriter.o) 
     -[GTMLoggerRingBufferWriter reset] in libGoogleAnalytics.a(GTMLoggerRingBufferWriter.o) 
     -[GTMLoggerRingBufferWriter dumpContents] in libGoogleAnalytics.a(GTMLoggerRingBufferWriter.o) 
     -[GTMLoggerRingBufferWriter logMessage:level:] in libGoogleAnalytics.a(GTMLoggerRingBufferWriter.o) 
     +[GANTracker sharedTracker] in libGoogleAnalytics.a(GANTracker.o) 
     +[GANTracker allocWithZone:] in libGoogleAnalytics.a(GANTracker.o) 
     -[GANTracker startTrackerWithAccountID:dispatchPeriod:delegate:] in libGoogleAnalytics.a(GANTracker.o) 
     -[GANTracker trackPageview:withError:] in libGoogleAnalytics.a(GANTracker.o) 
     -[GANTracker trackEvent:action:label:value:withError:] in libGoogleAnalytics.a(GANTracker.o) 
     -[GANTracker stopTracker] in libGoogleAnalytics.a(GANTracker.o) 
     -[GANTracker dispatch] in libGoogleAnalytics.a(GANTracker.o) 
    ".objc_class_name_NSUserDefaults", referenced from: 
     [email protected][email protected][email protected] in libGoogleAnalytics.a(GTMLogger.o) 
    ".objc_class_name_NSThread", referenced from: 
     [email protected][email protected][email protected] in libGoogleAnalytics.a(GTMLogger+ASL.o) 
    ".objc_class_name_NSBundle", referenced from: 
     [email protected][email protected][email protected] in libGoogleAnalytics.a(GANDataDispatcher.o) 
    ".objc_class_name_NSAssertionHandler", referenced from: 
     [email protected][email protected][email protected] in libGoogleAnalytics.a(GANTracker.o) 
     [email protected][email protected][email protected] in libGoogleAnalytics.a(GANPersistentEventStore.o) 
    ".objc_class_name_NSLocale", referenced from: 
     [email protected][email protected][email protected] in libGoogleAnalytics.a(GANDataDispatcher.o) 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 

一个在谷歌论坛的建议是创建一个虚拟实现GANTracker类的在模拟器中使用。即创建一个文件GANTracker_stub.m:

#import "GANTracker.h" 

#if TARGET_IPHONE_SIMULATOR 

@implementation GANTracker 

+ (GANTracker *)sharedTracker 
{ 
    return [[[GANTracker alloc] init] autorelease]; 
} 

- (void)startTrackerWithAccountID:(NSString *)accountID 
       dispatchPeriod:(NSInteger)dispatchPeriod 
        delegate:(id<GANTrackerDelegate>)delegate 
{ 
} 

- (void)stopTracker 
{ 
} 

- (BOOL)trackPageview:(NSString *)pageURL 
     withError:(NSError **)error 
{ 
    return YES; 
} 

- (BOOL)trackEvent:(NSString *)category 
     action:(NSString *)action 
     label:(NSString *)label 
     value:(NSInteger)value 
    withError:(NSError **)error 
{ 
    return YES; 
} 

- (BOOL)dispatch 
{ 
    return YES; 
} 

@end 
#endif 

然而,这是不是为我工作,是有什么我失踪?通过谷歌分析论坛发现

回答

3

解决方案:

用途:

lipo libGoogleAnalytics.a -remove i386 -output libGoogleAnalytics2.a

然后从你的项目中删除libGoogleAnalytics.a并添加libGoogleAnalytics2.a会同

这只能如上所示的GANTracker的虚拟实现。

+0

不错的发现!这也是我的问题。 – 2010-06-28 18:25:23

+0

会开始另一个问题,但是,你会很好地说*你对GANTracker_stub.m做了什么?论坛上的人们说要将代码复制到GANTracker_stub.m中,但接下来不做什么?使用-remove i386解决方案在我看来似乎不允许在SIM下运行? – Jann 2010-06-29 17:57:13

+0

我刚刚创建使用XCode添加了一个新文件,将其称为GANTracker_Stub.m。删除了GANTracker_Stub.h文件并将上面的代码复制到其中。然后当你编译你的项目时,GANTracker_Stub.m会自动覆盖静态库中的GANTracker实现。那有意义吗? – 2010-06-30 10:47:20