代码之家  ›  专栏  ›  技术社区  ›  CodeSmile Paul Beusterien

带静态指针的Objective-C类别:如何避免未定义符号错误?

  •  0
  • CodeSmile Paul Beusterien  · 技术社区  · 14 年前

    我有一个来自外部库的类,我想用一个类别来扩展它。但是,此类使用多个静态变量,例如:

    static SomeClass* someClass;
    

    我要扩展的category方法必须调用这个类,如

    -(void) categoryMethod
    {
       [someClass someMethod];
    }
    

    如果我这样做,编译器会抱怨:

    'someClass' was not declared in this scope
    

    所以我想我可能需要将static SomeClass声明为extern:

    extern SomeClass* someClass;
    

    但是,这会导致以下链接器错误:

    "_someClass", referenced from:
    _someClass$non_lazy_ptr in UsingSomeClass.o
    (maybe you meant: _someClass$non_lazy_ptr)
    Symbol(s) not found
    

    我想我错过了一些简单而愚蠢的东西。我可以很好地使用静态库。我猜静态变量是我要扩展的类的本地变量,有没有办法告诉链接器这些是我要使用的静态变量?

    或者不可能扩展使用静态变量的Objective-C类(分别在我的类别需要使用这些静态变量的地方)?

    注:由于我正在链接包含我要扩展的类的静态库,所以我最初确实遇到了需要用其他链接器标志-ObjC和-all-load来解决的问题。但我已经过去了,这不是问题,我可以为静态库中的其他类编写类别。

    1 回复  |  直到 14 年前
        1
  •  3
  •   David Gelhar    14 年前

    一个 static C中的变量(因此,在Objective-C中)不能在定义它的编译单元之外引用。这是一个你不能用“外部”来指代的内部符号。

    所以,不,您的category方法无法访问该静态变量。

    还要注意,“static”这个词的用法与静态库和动态库无关。

    推荐文章