我在使用SIMBL挂钩的外部应用程序中覆盖了某些功能时遇到了一些很大的麻烦。
在这个应用程序中,有一个类 - 让我们称之为“AppClass”。在这个类中有一个函数,
-(void)doSomething;
我从类倾销二进制文件中得到了这个。整个界面定义为:
@interface AppClass : NSObject
{
}
我正在尝试使用jr_swizzleMethod覆盖此函数:withMethod:error:
由于缺乏文档,这就是我提出的:
#import "JRSwizzle.h"
#import "AppClass.h"
@interface AppClass (MyPlugin)
- (void)myPlugin_doSomething;
@end
@implementation AppClass (MyPlugin)
- (void)myPlugin_doSomething {
NSLog(@"lol?");
}
@end
@implementation MyPlugin
+ (void) load {
Mylugin* plugin = [MyPlugin sharedInstance];
NSError *err = nil;
BOOL result = [NSClassFromString(@"AppClass") jr_swizzleMethod:@selector(doSomething) withMethod:@selector(myPlugin_doSomething) error:&err];
if(!result)
NSLog(@"<Plugin> Could not install events filter (error: %@)", err);
NSLog(@"Plugin installed");
}
+ (MyPlugin *)sharedInstance {
static MyPlugin* plugin = nil;
if(plugin == nil)
plugin = [[MyPlugin alloc] init];
return plugin;
}
@end
那应该够了吗?但是我在编译时遇到了这个错误:
Undefined symbols:
"_OBJC_CLASS_$_AppClass", referenced from:
l_OBJC_$_CATEGORY_AppClass_$_MyPlugin in MyPlugin.o
objc-class-ref-to-AppClass in MyPlugin.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
我该如何解决这个问题?
答案 0 :(得分:2)
您正在创建一个插件,它引用二进制中的符号(您尝试扩展的应用)。因此,您需要告诉链接器在哪里查找这些符号(在您的情况下,那是_OBJC_CLASS_$_AppClass
,即在二进制文件中定义的AppClass
。
)。
这是通过将选项-bundle_loader executable_name
传递给链接器来完成的。请参阅the man page for ld。