【问题标题】:Accessing private variable from Category generates linker error从 Category 访问私有变量会生成链接器错误
【发布时间】:2009-10-23 21:19:03
【问题描述】:

我有以下代码:

@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)和链接设备框架有什么不同?

【问题讨论】:

  • 您是否尝试过清理项目并重新构建?

标签: iphone objective-c uikit linker-errors


【解决方案1】:

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

值得一试。

【讨论】:

  • 我已经检查过了。一切都按照你说的方式设置。不是解决方案。
【解决方案2】:

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

【讨论】:

  • 也没有帮助。感谢您的建议。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2011-05-24
    • 2018-05-15
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    相关资源
    最近更新 更多