使用ld创建依赖于另一个共享库的共享库

时间:2013-09-10 06:58:59

标签: c++ c dll linker ld

我想创建一个共享库libdependent,使用头文件使用libparent中的某些导出函数。

构建阶段不知道libparent的路径,因此我无法使用rpath,而是在运行时调用dlopen("path/libparent.so", RLTD_NOW | RTLD_GLOBAL)dlopen("path/libdependent.so", RLTD_NOW | RTLD_GLOBAL)

但如果在链接和使用libparent期间将libdependent放入库搜索路径,则libparent.so文件中根本没有引用-lparent

当我尝试dlopen libdependent时,即使设置了RTLD_GLOBAL,也会出现“找不到符号”错误。

如果不调用libparent而使用dlsym的导出,我该怎么办?

2 个答案:

答案 0 :(得分:1)

首先,当你想要创建一个库时,你不必导入它,所以

  

dlopen(“path / libdependent.so”,RLTD_NOW | RTLD_GLOBAL)

不需要。

其次,如果您不确切知道将要使用的库(libparent)的名称,则必须使用动态链接和 dlopen 。在动态链接中,您不必通知链接器您的libparent库,但您必须使用动态链接库,因此链接器命令将如下所示:

  

g ++ -o output -dl input.cpp

dl 表示您将使用 dlopen

使用程序时,请确保从运行目录中可以看到libparent.so(或使用绝对路径)。还要检查dlopen的返回值以了解库开放的成功。

    void *handle = NULL;
    handle = dlopen("libparent.so", RTLD_LAZY);
    if(!handle){
        printf("Error!\r\n");
    }

希望它有所帮助。

答案 1 :(得分:0)

通过将-shared添加到链接器选项并在-l中指定库来解决此问题。 -(也很有用。