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

Xcode 如何仅在链接时有条件地使用静态库,xcode,static,ios,hook,Xcode,Static,Ios,Hook,我正在做一个iPhone插件项目,在那里我构建了一个静态库,我们称之为lib1.a,它是我提供给其他程序员的 当他们将lib1.a链接到他们的项目中时,他们也可能链接lib2.a,这是他们根据我给他们的头文件自己构建的。此标头仅包含一个“钩子”函数,该函数实例化obj-c对象 这一切都很好,但我希望链接lib1.a的项目不必链接lib2.a。请记住,iOS只支持静态库,我不想提供lib1.a的多个版本。如果让钩子自己注册,那么钩子代码的存在将自动注册,而缺少钩子代码则不会。显然,只从lib1.a

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

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


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

如果让钩子自己注册,那么钩子代码的存在将自动注册,而缺少钩子代码则不会。显然,只从lib1.a调用注册的钩子函数,就可以开始了:-


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

在objective-c中,您不能使用静态库向现有的objective-c类添加一个类别(使用新方法)

那么,如果lib1.a包含

@interface SomeObjectThatWantsToCallback
然后,lib2.a将包含

@interface SomeObjectThatWantstoCallBack (CallbackImpl)
-(void)HookProc:{
}
现在,如果希望回调lib1.a中的某个对象中的代码需要调用HookProc,那么它可以这样做

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

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

谢谢,Chris。我最终得到了类似的结果:可选的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
lib2.a实现工厂类。没有任何对OptionalStuffFactory类的编译时引用这一事实确保了如果缺少lib2.a,则没有未解决的问题


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

谢谢您的回复。通过这种方法,在Lob2.a中注册钩子的代码是如何执行的?静态分配C++类是一种方式。谢谢,克里斯。那就行了。然而,它变得有点混乱,因为lib2在理想情况下不应该知道或关心lib1。而且,LIB2将是面向对象的内部,因此不太好的要求LIb1的用户向其库中添加C++代码。
Class optionalStuffFactoryClass = NSClassFromString(@"OptionalStuffFactory");

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