正如标题所说......我对dlopen()
感兴趣。我知道应用程序商店不允许这样做,但我对iOS感到好奇。
我遇到的问题是我可以创建.dylib文件,我可以在运行时使用以下代码加载此文件
char *dylibPath = "/Applications/myapp.app/mydylib2.dylib";
void *libHandle = dlopen(dylibPath, RTLD_NOW);
if (libHandle != NULL) {
NSString * (*someMethod)() = dlsym(libHandle, "someMethod");
if (someMethod != NULL) {
NSLog(someMethod());
}
dlclose(libHandle);
}
这取自here。
我遇到的问题是,如果我更改mydylib2.dylib,dlopen
不会加载重新编译的.dylib文件。相反,它解析了函数someMethod
的旧版本。
例如,如果someMethod
首先返回@"Hello"
并将其更改为@"Hello World"
并重新编译,则上述代码将始终返回@"Hello"
,直到我重新启动应用程序为止模拟器。
有谁知道为什么会这样?并建议一个解决方法,以便可以在运行时重新加载此.dylib?
答案 0 :(得分:0)
查看dlclose
的{{3}},看起来有几个原因导致库无法卸载。
有几种情况下动态库永远不会出现 卸载:1)主要的可执行文件链接,2)一个API 没有supoort卸载(例如NSAddImage())用于加载它或一些 依赖于它的其他动态库,3)动态库是 在dyld的共享缓存中。
我怀疑你的问题是“dyld共享缓存”。您可以尝试运行:
sudo update_dyld_shared_cache -force
更换库后(不知道iOS上是否可用)。
您是否检查了dlclose
的返回值,看它是否成功?