我正在编译一个由多个项目组成的应用程序,它们生成动态库(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函数递归加载共享库有什么问题?
答案 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
查看库的动态部分的内容。