我创建了一个使用共享对象的简单程序,用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
答案 0 :(得分:4)
详细了解shared libraries及其search paths和ld命令。
另一种方法是注册用于搜索库的“运行时”路径。您可以使用gcc -Wl,-rpath . -o program program.c -L. -lmylib -ldl -Wall
如果你的程序是dlopen - 在运行时某个*.so
文件,你最好将绝对文件名传递给dlopen
(或类似"./foo.so"
) 。 realpath功能可以帮助您。
甚至还有一个命令chrpath(我刚刚发现)在现有的可执行文件上用来改变它的运行路径。
出于安全原因(类似于PATH
的原因),以避免将当前目录放在运行时路径或LD_LIBRARY_PATH
中。
答案 1 :(得分:2)
编译程序时,您正确链接了它;使用-L. -lmylib
。但是,如果它不是标准系统库,则执行环境需要知道在哪里查找它。一种方法是使用环境变量LD_LIBRARY_PATH
,如下所示:
LD_LIBRARY_PATH=. ./program
或
export LD_LIBRARY_PATH=.
./program