【问题标题】:Shared Library on Linux is not found找不到 Linux 上的共享库
【发布时间】:2018-04-04 20:10:59
【问题描述】:

我在 Ubuntu Linux 16.0.2 上从源代码构建了一些共享库。

它们是 64 位库。

我手动将它们复制到 /usr/local/lib。

我确认 /usr/local/lib 路径确实在 ld.so.conf 包含的 .conf 文件之一中。

然后我运行:sudo ldconfig 来更新缓存。

但是当我尝试运行我的可执行文件并尝试动态加载我之前使用 dlopen 复制到 /usr/local/lib 中的 .so 文件之一时,它失败了。

在我的代码中,我有:

dlopen ("foobar.so", RTLD_LAZY);

谁能告诉我我做错了什么?

【问题讨论】:

    标签: linux ubuntu shared-libraries


    【解决方案1】:

    动态链接器通常不会直接访问从/etc/ld.so.conf 递归包含的路径,但它使用缓存。

    你可以更新缓存

    sudo ldconfig
    

    更多详情请见ldconfig(8)

    【讨论】:

    • 我做到了,但还是没有运气。
    • 当我执行 sudo ldconfig -v 时,我复制到 /usr/local/lib 的库不会出现在文本转储中。不明白为什么。
    • @rohitsan 有趣,我在我的系统上试过了,它的名字似乎需要以lib 开头。 IOW,它适用于libfoobar.so(假设权限正确,但不是foobar.so)。
    • ldconfig 通常在启动时运行,但可能 OP 没有重新启动机器。
    • @rohitsan,您必须为该库定义一个 soname,并且必须像 soname 一样调用它们...通常您会看到库的完整名称,以及指向它的软链接索名。只有这样一个库才会包含在缓存映射中。
    【解决方案2】:

    为了让dlopen 工作,没有目录列表可以找到共享对象。所以dlopen("somefile", ...); 可能行不通。

    您无需使用任何路径或放置共享对象(或遵守命名约定)即可通过dlopen(3) 使用共享对象。这只是在启动时加载和链接所有共享库的动态链接器的要求:linux-vdso.so.1(64 位)

    要进行测试,只需将共享文件放在本地目录中,然后尝试使用它的基本名称打开它,就像您发布的那样。

    对于系统库,还有更多的要求,比如为库定义一个soname,供loader用来加载库和构造缓存数据库索引,所以如果你有不知道我在说什么,您将无法使用自动加载程序。如果您想查看可执行文件是否包含所需的所有库以及加载器在哪里找到它们,只需运行 ldd(1) 并将可执行文件作为参数,您将看到自动加载的依赖关系以及动态链接器如何解析路径。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      • 2014-06-13
      • 2016-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多