【问题标题】:loading a shared library from any directory从任何目录加载共享库
【发布时间】:2016-02-29 15:07:24
【问题描述】:

我正在玩共享库链接和加载过程,并尝试了解解决加载错误的不同方法:

error while loading shared libraries: ... : cannot open shared object file: No such file or directory

我设法通过使用 LD_LIBRARY_PATH 和使用 rpath 来解决它。我现在尝试理解 ldconfig 的用法以及它如何解决它[我的一些网络资源:123]

所以,我有以下源文件:test.c func1.c func2.c。这是我的工作:

  1. 将它们编译成 PIC .obj 文件:

$ gcc -Wall -fPIC -c *.c

  1. 从目标文件创建一个共享库,将其命名为“libshared.so”,并使用“soname”:

$ gcc -shared -Wl,-soname,libshared.so -o libshared.so *.o

  1. 通过告诉 GCC 在哪里可以找到共享库来链接共享库(... 只是我个人共享库路径的缩写):

$ gcc -L/home/.../my_shared_library -Wall -o mytest test.c -lshared

  1. 现在,我尝试运行它,并收到加载错误:

./mytest: error while loading shared libraries: libshared.so: cannot open shared object file: No such file or directory

  1. 所以我尝试告诉加载程序在我的私有目录中搜索共享库文件:

ldconfig -n home/.../my_shared_library

(当我的工作目录是 home/.../my_shared_library 时,我也尝试过:ldconfig -n .-L

并尝试再次运行它,但我仍然遇到同样的错误。我做错了什么?

【问题讨论】:

    标签: linux gcc linker loader


    【解决方案1】:

    使用GNU Libtool 来简化流程并避免此类错误。 构建库时也使用-fPIC 选项。

    【讨论】:

    • 感谢这个工具,我不熟悉它。但是,我想使用“直接”shell 命令,特别是 ldconfig,而不是隐藏使用共享库的复杂性。
    【解决方案2】:

    阅读Program Library HowTo & Drepper 的论文:How to Write Shared Libraries

    您可能想要设置rpath。见this question

    您可以在运行时使用dlopen(3) 加载您的插件。请注意,没有任何/ 的共享对象路径会被特殊处理。

    【讨论】:

    • HowTo 手册是我的学习资源之一,我链接到讨论我的问题内容的特定页面。正如我所写,我对 rpath 很熟悉,但我想使用 ldconfig 使事情正常进行(如何编写共享库对此也无济于事)。
    • 但是你没有设置rpath。我会在/etc/ld.so.conf 中放入一次/usr/local/lib/,将库放在/usr/local/lib/ 下并运行ldconfig
    • 嗯,我的理解是ldconfig -n <my personal directory>应该可以让加载器在我的共享库之后搜索指定的目录,而不需要把它放到/usr/local/lib中,也不需要需要使用rpath。这种理解源于一些阅读,这里有一个例子:“你可以在简单的情况下使用 gcc 的 -L 标志。你可以使用 ``rpath'...'”(来自这里 [link] tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
    猜你喜欢
    • 2020-05-04
    • 2019-02-10
    • 2019-04-17
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 2018-09-14
    相关资源
    最近更新 更多