如何在链接时有条件地使用静态库

时间:2010-10-29 11:41:32

标签: xcode static ios hook

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

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

这一切都运行正常,但我想将项目链接到lib1.a而不是必须链接lib2.a.请记住,iOS仅支持静态库,我不想提供多个版本的lib1.a。

3 个答案:

答案 0 :(得分:3)

谢谢,克里斯。我最终得到了类似的东西:可选的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,否则工厂类将被优化掉,因为没有编译时引用它。

答案 1 :(得分:1)

在objective-C中,您不能使用静态库将类别(使用新方法)添加到现有的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代码,该类别应该使用该方法扩展该类。

答案 2 :(得分:0)

如果您自己创建了挂钩寄存器,那么挂钩代码的存在会自行注册,缺少挂钩代码。显然,只能从lib1.a调用已注册的钩子函数,你可以去: -

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