如何在 Obj-C 应用程序中访问和使用 dylib?

发布于 2024-10-19 18:30:37 字数 487 浏览 1 评论 0原文

我制作了一个包含以下代码的 dylib:

    Test.h:

#import <Cocoa/Cocoa.h>
@interface Test : NSObject {
     int number;
}
-(void)beep;
-(void)giveInt:(int)num;
-(int)takeInt;

@end


Test.m:

#import "Test.h"

@implementation Test

-(void)beep {
     NSBeep();
}
-(void)giveInt:(int)num {
     number = num;
}
-(int)takeInt {
     return number;
}

@end

我已经编译了 dylib 并将其放入另一个项目中,但我似乎无法弄清楚如何从 dylib 中创建一个 Test 对象并调用一些方法。< br> 有人知道该怎么做吗?
谢谢,
马特

I've made a dylib that contains the following code:

    Test.h:

#import <Cocoa/Cocoa.h>
@interface Test : NSObject {
     int number;
}
-(void)beep;
-(void)giveInt:(int)num;
-(int)takeInt;

@end


Test.m:

#import "Test.h"

@implementation Test

-(void)beep {
     NSBeep();
}
-(void)giveInt:(int)num {
     number = num;
}
-(int)takeInt {
     return number;
}

@end

I've compiled the dylib and put it in another project but I can't seem to figure out how to make a Test object from the dylib and call some of the methods.
Anyone know how to do this?
Thanks,
Matt

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

爱情眠于流年 2024-10-26 18:30:37

仅供参考:动态库是在运行时加载的。如果不需要动态加载代码,请静态链接。

无论如何:

#import "test.h"
#include <dlfcn.h>

int main(int argc, const char *argv) {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    void *handle = dlopen("test.dylib", RTLD_LAZY);
    id t = [[NSClassFromString(@"Test") alloc] init];

    [t beep];
    [t release];

    dlclose(handle);
    [pool drain];
}

您需要包含一些错误检查,但这是基本思想。如果您想使用 NSBundle (根据具体情况,这可能更“合适”,请参阅 http://developer.apple.com/library/mac/#documentation/CoreFoundation/Conceptual/CFBundles/AccessingaBundlesContents/AccessingaBundlesContents.html)

Just fyi: Dynamic libraries are loaded at runtime. If you don't need to load code dynamically, link statically.

Anyway:

#import "test.h"
#include <dlfcn.h>

int main(int argc, const char *argv) {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    void *handle = dlopen("test.dylib", RTLD_LAZY);
    id t = [[NSClassFromString(@"Test") alloc] init];

    [t beep];
    [t release];

    dlclose(handle);
    [pool drain];
}

You'll want to include some error checking, but that's the basic idea. If you want to use NSBundle (which may be more "proper" depending on the circumstances, see http://developer.apple.com/library/mac/#documentation/CoreFoundation/Conceptual/CFBundles/AccessingaBundlesContents/AccessingaBundlesContents.html)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文