递归共享库加载 - 无法打开共享库文件

时间:2013-03-07 11:55:52

标签: c++ gcc dll shared-libraries codeblocks

我正在编译一个由多个项目组成的应用程序,它们生成动态库(LINUX上的共享库)。当然,不同的项目链接到我编译的其他项目。我在Ubuntu下使用CodeBlocks 10,使用GCC编译器。

由于根据用户指定的参数,应该加载不同的库,在我的主应用程序中,我根据决定加载适当的库,使用以下行:

dll = dlopen("my_library.so", RTLD_LAZY);

如文档中所指定,dlopen自动加载库如果库依赖于其他共享库并且该过程以递归方式完成。

问题是,在我的dlopen之后,我调用dlerror()以了解发生了什么,我收到以下错误:

  

../../../../ gccDebug / os.so:无法打开共享对象文件:没有这样的   文件或目录。

只是看错误,我完全理解它,因为它看起来比它应该更多的2个文件夹。问题是为什么?

我的意思是:我使用相对路径在项目上显式加载共享库。在我的主应用程序中,工作目录是../../gccDebug。 我使用dlopen加载mylibrary.so,它显式加载(在项目选项中)../../ gccDebug/gui.so。这个gui.so然后也显式加载(在项目选项中)../../ gccDebug / so.os

在我看来正在发生的事情是,他正在寻找一条路径,在第三次“迭代”中,他正在寻找一条路径,这条路径已经搜索了太多的文件夹。如果第一次递归加载(gui.so)工作得很好,为什么第二次递归加载(so.os)会给出一个奇怪的路径?

使用dlopen函数递归加载共享库有什么问题?

1 个答案:

答案 0 :(得分:2)

每个路径应该相对于正在进行加载的库,因此../../gccDebug/gui.so要在同一目录中加载某些内容,它应该加载./gui.so

额外的../..是因为您已在../../gccDebug中说明要加载某些内容../../gccDebug {{}}} .. / .. / gccDebug / .. / ../ gccDebug _relative to itself_ which relative to your program's working directory is ../../../ gccDebug`

为不同的库做几次,你会得到你看到的不需要的i.e.组件的数量。

您确定..实际加载了吗?可能是gui.so在链接时从mylibrary.so复制了../../gccDebug/os.so依赖项,因此在运行时尝试在加载gui.so之前加载它?

您是否使用gui.so查看它试图找到的内容?您还可以使用ldd mylibrary.so查看库的动态部分的内容。

相关问题