递归共享库加载-无法打开共享对象文件
Recursive shared library loading - Cannot open shared object file
我正在编译一个由几个项目组成的应用程序,这些项目生成动态库(LINUX上的共享库(。当然,不同的项目正在链接到我编译的其他项目。我在Ubuntu下使用CodeBlocks 10,使用GCC编译器。
由于事实上,根据用户指定的参数,应加载不同的库,在我的主要应用程序中,我正在根据决定加载适当的库,如下所示:
dll = dlopen("my_library.so", RTLD_LAZY);
如文档中所述,如果库依赖于其他共享库,并且该过程是递归完成的,则dlopen会自动加载库。
问题是,在我的dlopen之后,我立即调用dlerr((来了解发生了什么,我得到了以下错误:
../../..//gccDebug/os.so:无法打开共享对象文件:没有这样的文件文件或目录。
只要看一下这个错误,我就完全理解了,因为它在下面找的2个文件夹比它应该找的多。问题是为什么?
我的意思是:我使用相对路径在项目上显式加载共享库。在我的主应用程序上,工作目录是..//gccDebug。我使用dlopen加载mylibrary.so,它显式加载(在项目选项中(..//gccDebug/gi.so。然后此gui.so也显式加载(在项目选项中(..//gccDebug/so.os
在我看来,正在发生的事情是,他正在添加路径,使得在第三次"迭代"时,他正在寻找一个已经搜索了太多文件夹的路径。如果第一次递归加载(gui.so(运行良好,为什么第二次递归加载会给出一条奇怪的路径??
使用dlopen函数递归加载共享库有什么问题?
每个路径都应该相对于进行加载的库,因此../../gccDebug/gui.so
要在同一目录中加载某些内容,就应该加载./gui.so
额外的../..
是因为你已经告诉../../gccDebug
中的某个东西在../..中加载某个东西/gccDebug _relative to itself_ which relative to your program's working directory is
.//gccDebug/..//gccDebug i.e.
./..//gccDebug`
对于不同的库,这样做几次,就会得到您看到的不需要的..
组件的数量。
你确定gui.so
真的加载了吗?可能是mylibrary.so
在链接时从gui.so
复制了../../gccDebug/os.so
依赖项,所以在运行时试图在加载gui.so
之前加载它吗?
你有没有用ldd mylibrary.so
看看它试图找到什么?您也可以使用readelf -d mylibrary.so
来查看库的动态部分的内容。
- 在共享文件夹上恢复有效权利的问题
- C 11中线程之间的共享文件记录
- 在线程之间共享文件描述符
- ReadFile winapi在从虚拟盒共享文件夹读取时失败.GetLastError正在引发错误183
- 在写入远程Windows共享文件夹的所有者时,GetNamedSecurityInfo返回ERROR_ACCESS_DE
- 以编程方式在非 Windows 计算机中创建共享文件夹
- 在 DLL 中打开共享文件
- 在VirtualBox的共享文件夹中构建符号链接共享库
- 如何在Windows平台中获取远程Windows服务器的共享文件夹的文件列表
- Qt:有共享文件夹的类吗?
- 在Windows 2008 R2服务器/ Windows 7中,判断谁正在访问共享文件夹中的文件
- OpenMP共享文件处理程序
- NetShareEnum(.)winapi无法删除不必要的共享文件夹
- NuGet与TeamCity的项目由2个解决方案共享- .h文件未找到
- 如何共享文件删除权限时,我打开一个文件ifstream
- 为共享文件使用预处理器指令
- 在QtC++中将一个简单文件夹转换为共享文件夹
- 如何让python识别读取预编译的共享文件
- 共享文件视图-访问控制
- 在Visual C++10中在项目之间共享文件