从任何目录加载共享库

时间:2016-02-29 15:07:25

标签: linux gcc linker loader

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

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文件:
  2. $ gcc -Wall -fPIC -c *.c

    1. 从目标文件创建共享库,命名为' libshared.so',并使用' soname':
    2. $ gcc -shared -Wl,-soname,libshared.so -o libshared.so *.o

      1. 通过告诉GCC在哪里找到共享库来链接共享库(...只是我个人共享库路径的缩写):
      2. $ gcc -L/home/.../my_shared_library -Wall -o mytest test.c -lshared

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

          1. 所以我尝试告诉加载器在我的私人目录中搜索共享库文件:
          2. ldconfig -n home/.../my_shared_library

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

您可能想要设置rpath。请参阅this question

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