我与共享库的链接和加载程序加载播放共享库,并试图了解不同的方法来解决加载错误:从任何目录
error while loading shared libraries: ... : cannot open shared object file: No such file or directory
我设法解决这个问题使用LD_LIBRARY_PATH和使用rpath。我现在试着理解的LDCONFIG的使用,以及它如何解决它,太[我的一些网络资源:1,2,3]
所以,我有以下的源文件:test.c func1.c func2.c
。这是我做的:
- 它们编译成PIC .obj文件:
$ gcc -Wall -fPIC -c *.c
- 创建从对象文件的共享库,并将其命名为'libshared.so',并且使用 '的soname':
- 与一个共享库链接(该
...
仅仅是我的个人共享库路径中的缩写): - 现在,我尝试运行它,并得到加载错误:
- 所以我尽量告诉加载器来搜索我的私有目录中的共享库文件:
$ gcc -shared -Wl,-soname,libshared.so -o libshared.so *.o
$ 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 )
并尝试再次运行它,但我仍然得到相同的错误。我究竟做错了什么?
HowTo手册是我的学习资源之一,我链接到讨论我的问题内容的特定页面。正如我写的,我熟悉rpath,但我想使用ldconfig使其工作(如何写共享库也无助于此)。 – HeyJude
但你不设置'rpath'。我会在'/ etc/ld.so.conf'里放一次'/ usr/local/lib /',把这个库放在'/ usr/local/lib /'下并运行ldconfig' –
嗯,我的理解是''ldconfig -n <我的个人目录>'应该使加载器可以在我的共享库之后搜索指定的目录,而不需要将它放到/ usr/local/lib中,也不需要使用rpath。这种理解源自一些阅读,下面是一个例子:“你可以在简单的情况下使用gcc的-L标志,你可以使用''rpath'...'”(从这里[link] http://tldp.org /HOWTO/Program-Library-HOWTO/shared-libraries.html) – HeyJude