【问题标题】:How to conditionally use static library only when linked如何仅在链接时有条件地使用静态库
【发布时间】:2010-10-29 11:41:32
【问题描述】:

我正在做一个 iPhone 插件项目,我在其中构建了一个静态库,我们称之为 lib1.a,我提供给其他程序员。

当他们将 lib1.a 链接到他们的项目中时,他们也可能会链接 lib2.a,这是他们根据我给他们的头​​文件自己构建的。此标头仅包含一个实例化 obj-c 对象的“钩子”函数。

这一切都很好,但我希望项目将 lib1.a 链接到 必须 链接 lib2.a。请记住,iOS 只支持静态库,我不想提供多个版本的 lib1.a。

【问题讨论】:

    标签: xcode static ios hook


    【解决方案1】:

    谢谢,克里斯。我最终得到了类似的东西:可选的 lib2.a 包含一个工厂类,它创建一个对象,该对象实现了某个协议,该协议公开了可选功能。这是标题:

    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    
    @protocol OptionalStuffDelegate
    
    // Delegate methods here
    
    @end
    
    @protocol OptionalStuff
    
    // Methods here
    
    @end
    
    @interface OptionalStuffFactory : NSObject {}
    
    + (id<OptionalStuff>)instantiateWithDelegate:(id <OptionalStuffDelegate>)delegate baseView:(UIView *)baseView;
    
    @end
    

    要在 lib1.a 中实例化,我这样做:

    Class optionalStuffFactoryClass = NSClassFromString(@"OptionalStuffFactory");
    
    if (optionalStuffFactoryClass != nil)
    {
        optionalStuff = [optionalStuffFactoryClass performSelector: @selector(instantiateWithDelegate:baseView:) withObject: self withObject: glView];
    }
    

    lib2.a 实现了工厂类。没有对 OptionalStuffFactory 类的任何编译时引用这一事实确保了在 lib2.a 丢失的情况下没有未解决的问题。

    重要提示:您必须确保包含库的构建目标使用链接器标志 -ObjC,否则工厂类将被优化掉,因为没有对它的编译时引用。

    【讨论】:

      【解决方案2】:

      难道你不能在 Objective-C 中使用静态库来添加一个 Category - 使用新方法到现有的 Objective-C 类中吗?

      所以,如果 lib1.a 包含

      @interface SomeObjectThatWantsToCallback
      

      然后,lib2.a 将包含的定义

      @interface SomeObjectThatWantstoCallBack (CallbackImpl)
      -(void)HookProc:{
      }
      

      现在,如果 lib1.a 中 SomeObjectThatWantsToCallBack 中的代码需要调用 HookProc,它可以这样做

      if( [self respondsToSelector: @selector( HookProc: )])
        [self HookProc];
      

      嗯,类似的。假设已经添加了 lib2.a 代码,那么该类别应该已经使用该方法扩展了该类。

      【讨论】:

        【解决方案3】:

        如果你让钩子自己注册,那么钩子代码的存在会自我注册,而没有钩子代码则不会。显然,只从 lib1.a 调用注册的钩子函数就可以了:-

        你不需要做任何复杂的事情,只需使用 c/c++/obj-c 的基本特性即可获得这种行为。

        【讨论】:

        • 感谢您的回复。采用这种方式,lib2.a中注册hook的代码如何执行?
        • 静态分配的 c++ 类是一种方式。
        • 谢谢,克里斯。那会奏效。然而,它变得有点混乱,因为理想情况下 lib2 不应该知道或关心 lib1。另外,lib2 内部将是面向 obj-c 的,所以要求 lib1 的用户将 C++ 代码添加到他们的 lib 中感觉不太好。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-08
        • 1970-01-01
        • 1970-01-01
        • 2013-05-14
        • 2015-02-25
        • 1970-01-01
        相关资源
        最近更新 更多