1

我有以下代码:

@interface UIAcceleration (Simulation)

- (id) initWithTimestamp:(NSTimeInterval)aTimeStamp
                     X:(UIAccelerationValue)ax
                     Y:(UIAccelerationValue)ay
                     Z:(UIAccelerationValue)az;

@end

@implementation UIAcceleration (Simulation)

-(id)initWithTimestamp:(NSTimeInterval)aTimeStamp
                     X:(UIAccelerationValue)ax
                     Y:(UIAccelerationValue)ay
                     Z:(UIAccelerationValue)az 
{
    if (self = [super init])
    {
        timestamp = aTimeStamp;
        x = ax;
        y = ay;
        z = az;
    }

    return self;
}       

@end

为模拟器 SDK 编译时,一切正常。为设备 SDK 编译时,出现以下链接器错误:

  "_OBJC_IVAR_$_UIAcceleration.x", referenced from:
      _OBJC_IVAR_$_UIAcceleration.x$non_lazy_ptr in UIAcceleration+IRowAdditions.o
  "_OBJC_IVAR_$_UIAcceleration.y", referenced from:
      _OBJC_IVAR_$_UIAcceleration.y$non_lazy_ptr in UIAcceleration+IRowAdditions.o
  "_OBJC_IVAR_$_UIAcceleration.z", referenced from:
      _OBJC_IVAR_$_UIAcceleration.z$non_lazy_ptr in UIAcceleration+IRowAdditions.o
  "_OBJC_IVAR_$_UIAcceleration.timestamp", referenced from:
      _OBJC_IVAR_$_UIAcceleration.timestamp$non_lazy_ptr in AccelerometerSimulation.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

我究竟做错了什么?链接到模拟器框架(即 UIKit)和链接到设备框架有什么不同?

4

3 回答 3

0

我想你可能只包含了 UIKit 框架的模拟器版本。我对此不太确定,但转到 Xcode 的左窗格和Frameworks文件夹下,右键单击UIKit.frameworkGet Info。在我的路径/System/Library/Frameworks/UIKit.framework下,它显示路径类型: “相对于当前 SDK”。这应该会根据您的构建目的自动提取正确的框架。

值得一试。

于 2009-10-23T21:29:26.537 回答
0

这可能与iPhone 上的类别问题有关。尝试将 -ObjC (iPhone OS 2.x) 和 -all_load (iPhone OS 3.0) 添加到“其他链接器标志”中。

于 2009-10-24T01:23:22.607 回答
0

好的,由于给出的答案都没有帮助,我做了一些不同的事情。

我创建了一个与 UIAcceleration 具有完全相同接口的类。因为它们都具有相同的内存布局,所以我可以安全地在 UIAcceleration 的指针和我的类之间进行转换。至少只要 gcc 想要。

于 2009-11-10T17:47:17.557 回答