我如何链接C中的共享对象?

我做了一个简单的程序,使用共享对象,用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 

所以我search了互联网,发现我必须将我的共享对象复制到/lib/i386-linux-gnu/以便程序运行。 所以我这样做了,而且工作,但是我试图以其他方式做,所以我从/lib/i3686-linux-gnu/目录中删除了libmylib.so 。 现在,当我试图运行该程序时,显示没有错误,但一直说Segmentation fault 。 很显然,共享对象是无处可寻,但我怎么能链接它,而不需要复制任何东西?

我正在使用Ubuntu 11.10

当你编译程序,你正确地链接它; 使用-L. -lmylib -L. -lmylib 。 但是,如果它不是一个标准的系统库,执行环境需要知道在哪里查找它。 一种方法是使用环境变量LD_LIBRARY_PATH ,如下所示:

 LD_LIBRARY_PATH=. ./program 

要么

 export LD_LIBRARY_PATH=. ./program 

阅读有关共享库及其搜索路径的更多信息,以及ld命令。

另一种方法是注册用于搜索库的“运行时”路径。 你可以使用gcc -Wl,-rpath . -o program program.c -L. -lmylib -ldl -Wall gcc -Wl,-rpath . -o program program.c -L. -lmylib -ldl -Wall

如果你的程序在运行的时候使用dlopen -ing *.so文件,你最好将绝对文件名传递给dlopen (或者类似"./foo.so" )。 realpath函数可以帮助你。

甚至有一个命令chrpath (我刚刚发现)使用现有的可执行文件来更改其运行路径。

存在安全原因(类似于PATH ),以避免将当前目录放在运行时路径或LD_LIBRARY_PATH