【发布时间】:2012-02-06 06:20:13
【问题描述】:
我有一个动态库,我使用dlopen() 加载,然后使用dlclose() 卸载;
如果我不包含任何目标 c 代码 dlopen() 需要一个 dlclose() 调用,这是预期的行为。但是,当我包含任何要定位的目标 c 代码时,我遇到的问题是我需要对加载的库进行两次 dlclose() 调用才能卸载。
这是预期的行为吗?我该如何解决?
【问题讨论】:
-
你确定你的库不是
dlopen-ed 两次以隐藏的方式吗?或者可能是一个错误-例如内存泄漏 - 正在覆盖dlopen-ed 句柄附近的内存? -
dlopen 在库句柄上保留引用计数。如果 dlopen 执行了两次,则需要两次 dlclose() 来卸载库。如果包含 obj-C 代码,是否可能需要动态库?在这种情况下,第一次 dlopen 可能会在您运行程序时完成
-
是的,我敢肯定它没有 dlopened 两次。您可以在 main 中尝试一个简单的程序,使用 dlopen,然后使用具有目标 c 代码的动态库的 dlclose。
-
@Finslicer:我确信程序启动时不需要动态库。正如我所说,如果有客观的 c 代码,即使是一个简单的 main 和 dlopen 然后 dlclose 也不能按预期工作。
标签: objective-c c macos cocoa dylib