如何在C中链接共享对象?

时间:2011-12-16 18:33:24

标签: linux gcc linker shared-libraries

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

2 个答案:

答案 0 :(得分:4)

详细了解shared libraries及其search pathsld命令。

另一种方法是注册用于搜索库的“运行时”路径。您可以使用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