C++ C++;:dlclose不';t卸载共享库

C++ C++;:dlclose不';t卸载共享库,c++,shared,dlopen,C++,Shared,Dlopen,我使用dlopen加载了一个共享库(带有RTLD\u NOW | RTLD\u GLOBAL)。 如果此库正在使用主程序中的函数,则不会卸载。因此,即使我卸载(使用dlclose)、更改、编译(重新)加载它,我也会为这个共享库使用相同的代码 我的目标实际上是在对同一个库进行更改后重新加载它,这样我就不必重新启动整个程序来测试我的代码 我正在Linux Ubuntu 10.04上使用g++4.2.3 (编辑) 已解决: “由于RTLD_全局,加载的库使用符号”。事实上,我有另一个符号。一个嵌入的链

我使用
dlopen
加载了一个共享库(带有
RTLD\u NOW | RTLD\u GLOBAL
)。 如果此库正在使用主程序中的函数,则不会卸载。因此,即使我卸载(使用
dlclose
)、更改、编译(重新)加载它,我也会为这个共享库使用相同的代码

我的目标实际上是在对同一个库进行更改后重新加载它,这样我就不必重新启动整个程序来测试我的代码

我正在Linux Ubuntu 10.04上使用g++4.2.3

(编辑)

已解决:


“由于RTLD_全局,加载的库使用符号”。事实上,我有另一个符号。一个嵌入的链接可能会被调用,阻止我的库关闭。。。 我认为可以验证使用dlopen(…,RTLD_NOLOAD)卸载的库是否已正确卸载。

函数
dlclose()
减少动态库句柄上的引用计数。如果引用计数降至零,并且没有其他加载的库在其中使用符号,则卸载动态库

另外,
RTLD_节点节点
(在
dlopen
时)使
dlclose
不卸载库


由于您没有使用
RTLD\u节点节点
,最有可能的情况是加载的库由于
RTLD\u全局
而使用了符号

您正在释放dll的句柄吗?您可能需要更具体地说明您使用的是哪个平台(Linux?)和哪个版本。这可能会对此类问题产生影响。@Komyg:我使用的是dlclose(句柄),所以我假设句柄是释放的…@Jonathan:我使用的是linux ubuntu 10.04上的g++4.2.3,您可能需要注意,这是相关的,但绝对不是直接的重复,因为它指的是MacOS X。您的可执行文件是否有可能加载库?
ldd-your\u-executable
是否列出了库?“由于RTLD\u-GLOBAL,加载的库使用了一个符号”。事实上,我在链接时嵌入了a.a的符号,可能会被回调,阻止库关闭。。。我想我可以验证使用dlopen(RTLD_NOLOAD)卸载的lib是否正确卸载了库