如何使用objective-C加载dylib或.a(静态库)文件?

use*_*854 4 macos objective-c .net-assembly

C#代码:( windows)

Assembly assembly = Assembly.LoadFrom(AssemblyPath);
System.Type[] objTypes = assembly.GetTypes();
Type libType = null;
Run Code Online (Sandbox Code Playgroud)

我想为Mac实现相同的功能,其中AssemblyPath是静态库(libTEST.a)或dylib文件的路径.在Objective-C(Mac)中可以吗?我试过NSBundle.但我想要一些好的解决方案.

小智 13

首先,这与Xcode 完全无关.

现在,您无法动态加载静态库,因为静态库只是目标文件的集合,它们本身不是可执行的.

要加载动态库,请使用dlopen()API:

void *handle = dlopen("/path/to/library.dylib", RTLD_LAZY);
Run Code Online (Sandbox Code Playgroud)

要获得C函数指针:

int (*computeAnswer)(void) = dlsym(handle, "ComputeAnswer");
int answer = computeAnswer(); // 42
Run Code Online (Sandbox Code Playgroud)

要获得没有extern "C"链接的C++函数指针(错位名称):

int (*mangledFunction)(void) = dlsym(handle, "i$mangledFunction_@v");
Run Code Online (Sandbox Code Playgroud)

您甚至可以通过链接器编译器的Objective-C命名约定来解决自己:

@class MyShinyClass;
Class cls = dlsym(handle, "OBJC_CLASS_$_MyShinyClass");

MyShinyClass *instance = [[cls alloc] init];
Run Code Online (Sandbox Code Playgroud)

完成库后,请将其丢弃:

dlclose(handle);
Run Code Online (Sandbox Code Playgroud)