2013-03-07 63 views
1

我正在编译一个由多个项目组成的应用程序,这些项目会生成动态库(LINUX上的共享库)。当然,不同的项目正在链接到我编译的其他项目。我在Ubuntu下使用CodeBlocks 10,使用GCC编译器。递归共享库加载 - 无法打开共享对象文件

原因在于,根据用户指定的参数,不同的库将被加载,在我的主要应用我加载相应的库,根据决定,以下行的事实:

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

如文档中所述,dlopen会自动加载库如果库对其他共享库有依赖关系,并且递归完成该过程。

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

../../../../gccDebug/os.so : Cannot open shared object file: No such file or directory.

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

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

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

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

+0

你是什么意思“在项目选项”? – 2013-03-07 14:17:33

+0

代码块构建选项 – filipehd 2013-03-08 08:47:50

回答

2

每个路径应该是相对于库做装载,所以../../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来查看库的动态部分的内容。

+0

是的,我想它在链接时复制。事情是,我在Windows和Linux下都有相同的项目,都在Codeblocks上。在WINDOWS上,他可以在没有任何问题的情况下解决相对路径问题,只在Linux上使用dlopen(因为使用CB的Project Build选项显式加载库不会引起任何问题),所以最终我得到了这样一个愚蠢完全没有意义的路径。而且我不认为我必须将我所有的图书馆转移到他想要的位置,因为“因为”。必须有一种方法就像在Windows上,我是对的吗? – filipehd 2013-03-08 09:06:38

+0

是的,只是使每个共享库相对于加载它的库的路径,而不是可执行文件 – 2013-03-08 09:10:06

+0

这就是我正在做的... – filipehd 2013-03-08 09:10:49

相关问题