2016-02-29 66 views
0

我与共享库的链接和加载程序加载播放共享库,并试图了解不同的方法来解决加载错误:从任何目录

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

  • 创建从对象文件的共享库,并将其命名为'libshared.so',并且使用 '的soname':
  • $ gcc -shared -Wl,-soname,libshared.so -o libshared.so *.o

    通过告诉GCC在哪里可以找到共享库
  • 与一个共享库链接(该...仅仅是我的个人共享库路径中的缩写):
  • $ gcc -L/home/.../my_shared_library -Wall -o mytest test.c -lshared

  • 现在,我尝试运行它,并得到加载错误:
  • ./mytest: error while loading shared libraries: libshared.so: cannot open shared object file: No such file or directory

  • 所以我尽量告诉加载器来搜索我的私有目录中的共享库文件:
  • ldconfig -n home/.../my_shared_library

    (我也试了一下:ldconfig -n .-L当我的工作目录是家庭/.../ my_shared_library )

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

    回答

    0

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

    你可能要设置的rpath。请参阅this question

    您可能会在运行时加载您的插件dlopen(3)。请注意,没有任何/的共享对象路径是专门处理的。

    +0

    HowTo手册是我的学习资源之一,我链接到讨论我的问题内容的特定页面。正如我写的,我熟悉rpath,但我想使用ldconfig使其工作(如何写共享库也无助于此)。 – HeyJude

    +0

    但你不设置'rpath'。我会在'/ etc/ld.so.conf'里放一次'/ usr/local/lib /',把这个库放在'/ usr/local/lib /'下并运行ldconfig' –

    +0

    嗯,我的理解是''ldconfig -n <我的个人目录>'应该使加载器可以在我的共享库之后搜索指定的目录,而不需要将它放到/ usr/local/lib中,也不需要使用rpath。这种理解源自一些阅读,下面是一个例子:“你可以在简单的情况下使用gcc的-L标志,你可以使用''rpath'...'”(从这里[link] http://tldp.org /HOWTO/Program-Library-HOWTO/shared-libraries.html) – HeyJude

    2

    使用GNU Libtool来简化过程并避免此类错误。 当你建立你的图书馆时,还可以使用-fPIC选项。

    +0

    感谢这个工具,我对它并不熟悉。不过,我想直接使用shell命令,特别是使用ldconfig,而不是隐藏使用共享库的复杂性。 – HeyJude