【问题标题】:Creating shared library that depends on another shared library using ld使用 ld 创建依赖于另一个共享库的共享库
【发布时间】:2013-09-10 06:58:58
【问题描述】:

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

libparent 的路径在构建阶段是未知的,所以我不能使用rpath,而是在运行时调用dlopen("path/libparent.so", RLTD_NOW | RTLD_GLOBAL) 和dlopen("path/libdependent.so", RLTD_NOW | RTLD_GLOBAL)。

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

当我尝试dlopenlibdependent 时,即使设置了RTLD_GLOBAL,我也会收到“无法定位符号”错误。

我应该怎么做才能使用来自libparent 的导出而不调用dlsym?

【问题讨论】:

  • 您使用什么链接器标志,即您的链接命令是什么?
  • -Lpath_to_temp_folder_with_libparent -lparent.
  • 我不知道为什么,但是 Android ndk-build 使用 g++ 而不是 ld 进行链接。

标签: c++ c dll linker ld


【解决方案1】:

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

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

不需要。

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

g++ -o 输出 -dl 输入.cpp

dl 表示你将使用 dlopen。

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

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

希望对你有帮助。

【讨论】:

  • 我不从自身加载libdependent,而是从它应该使用的地方加载它。我知道libparent 的名称,但不知道它的路径。我尝试添加-dl,但没有帮助。我检查返回值和dlerror。 libparent 加载正常,但是当我加载 libdependent 时,我得到“找不到符号 somesymbolfromlibparent”。
  • 我使用Android NDK-Build编译,代码只是一个普通头文件,函数声明为extern "C",函数体在libparent,调用在libdependent,还有另一个库,dlopens 两者都有。
  • 据我了解,您必须在依赖库的库中对“libparent.so”执行“dlopen”操作才能正确使用“libparent.so”中的函数。然后在您的目标程序中执行 libdependent.so 的 dlopen。不需要 dlopen libparent。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-06
    • 2018-08-25
    • 2018-02-12
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 2014-03-22
    • 2011-10-01
    相关资源
    最近更新 更多