如果此问题在此论坛之前已经重复,我很抱歉.我有一个问题,在Mac中加载和卸载dylib不能正常工作(特别是卸载部分.).问题是,如果我有一个可执行文件,如果我加载一个共享库说A.dylib然后使用加载的共享库加载一个库说B.dylib.当我尝试在稍后阶段卸载库B.dylib时,没有返回错误代码(返回int值为0 - 因为我使用常规dlopen和dlclose函数来加载和卸载库,0表示成功卸载) ,但是当我检查以确保使用活动监视器或lsof时,b.dylib仍然在内存中.
现在我们正在为windows,linux和mac移植这段代码.Windows和Linux按预期工作,但只有mac给我带来了问题.
我正在阅读mac开发人员库并发现:"有几种情况永远不会卸载动态库:1)主要可执行文件链接,2)不支持卸载的API(例如NSAddImage())用于加载它或一些依赖它的动态库,3)动态库在dyld的共享缓存中."
在我的情况下,我不会跌倒前两个案件中的任何一个.我怀疑案件3.
这是我的问题:1.我能做些什么来确保我有案例3?2.如果是,如何解决?3.如果没有,如何解决?4.为什么mac如此不同?
在这方面的任何帮助表示赞赏!
谢谢,Jan
将共享库加载到可执行文件中时,该库导出的所有符号都是解析可执行文件所需符号的候选项,如果DYLD链接器绑定到非预期符号,则会使库保持加载状态.您可以使用nm列出共享库中的符号,并且可以设置环境变量以启用动态链接器的调试输出(请参阅dyld上的此手册页).您需要设置DYLD_PRINT_BINDINGS环境变量.
最有可能的是,您需要将导出的符号限制为可执行文件使用的特定子集,以便只绑定您打算使用的符号.这可以通过将所需符号放在文件中并通过-exported_symbols_list选项传递给链接器来完成.如果不这样做,您最终可以在dyloaded库中绑定一个符号,并且它不会被卸载,因为它们需要解析可执行文件中的符号,并且在调用dlclose()时不会卸载.