我制作了一个使用共享对象的简单程序,用以下命令打开它dlopen()
。我还编译并链接了共享对象,如下所示:
gcc -o libmylib.so libmylib.c -shared -fPIC -Wall
gcc -o program program.c -L. -lmylib -ldl -Wall
当我第一次尝试运行该程序时,它说了类似的话
cannot open libmylib.so: no such file or directory
所以我在互联网上搜索,发现我必须将我的共享对象复制到/lib/i386-linux-gnu/
为了让程序运行。所以我这样做了,它起作用了,但后来我尝试以其他方式做到这一点,因此我删除了libmylib.so
来自/lib/i3686-linux-gnu/
目录。现在,当我尝试运行该程序时,它没有显示任何错误,但一直说Segmentation fault
。很明显,共享对象无处可寻,但是如何在不复制任何内容的情况下链接它呢?
我使用的是Ubuntu 11.10
阅读更多关于共享库 http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html和他们的搜索路径 http://www.eyrie.org/~eagle/notes/rpath.html,以及ld http://linux.about.com/library/cmd/blcmdl1_ld.htm命令。
另一种方法是注册用于搜索库的“运行时”路径。你可以使用gcc -Wl,-rpath . -o program program.c -L. -lmylib -ldl -Wall
如果你的程序是dlopen http://linux.die.net/man/3/dlopen- 在运行时一些*.so
文件,你最好将绝对文件名传递给dlopen
(或者类似的东西"./foo.so"
). The realpath http://linux.die.net/man/3/realpath函数可以帮助你。
甚至还有一个命令chrpath http://linux.die.net/man/1/chrpath(我刚刚发现)用于现有的可执行文件来更改其运行路径。
有安全原因(类似于PATH
)以避免将当前目录放入运行时路径或LD_LIBRARY_PATH
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)