构建共享对象库:ldd不显示指定的名称

时间:2017-09-14 17:03:35

标签: c gcc shared-libraries shared-objects ldd

我试图在Debian上构建一个共享对象库

cat /etc/issue
Debian GNU/Linux 9 \n \l

我正常构建库和对象(wrap.c用作创建所有目标文件的包装器)

gcc -c -fPIC -W -Wall -O2 -funroll-loops wrap.c
gcc -shared -Wl,-soname,libtest.so -o libtest.so *.o
mv libtest.so /usr/local/lib/ && mv test-header.h /usr/local/include/

然后我创建一个test.c来拉入库并按如下方式成功编译:

gcc test.c -ltest

但是,运行程序./a.out会返回以下错误:

  

./ a.out:加载共享库时出错:libtest.so:无法打开共享对象文件:没有这样的文件或目录

检查.so,我看到了:

$ ldd /path/to/libtest.so
    linux-vdso.so.1 (0x00007ffdb71c5000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1c22fba000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f1c23560000)

我甚至看不到libtest.so => none,至少会告诉我它无法找到图书馆。

我不确定这里发生了什么。

我要使用相同的进程(使用.dylib)在macOS上成功创建gcc -dynamiclib -o libtest.dylib *.o,并且我可以在可执行文件中成功调用库。我不确定Debian上有什么不同。

1 个答案:

答案 0 :(得分:3)

您已放置的共享库libtest.so/usr/local/lib中将由链接器定位 命令

gcc test.c -ltest

因为/usr/local/lib是链接器的默认搜索 路径。

但是,运行时加载程序 不会位于那里 当您尝试运行./a.out因为运行时 loader不会直接搜索目录 变量LD_LIBRARY_PATH的值中列出的那些,如果有的话, 在当前的环境中。默认情况下,它会搜索库 在ldconfig注册 缓存,并更新该缓存以注册新出现的库 只能通过运行ldconfig(以root身份)。

因此,要运行程序,您有两种选择: -

要在当前shell中取得成功,请运行:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib; ./a.out

为了获得持久的成功,请运行:

sudo ldconfig

然后你的程序将在任何shell中运行。

当然,顺便说一句,ldd /path/to/libtest.so告诉你 libtest.so的共享库依赖项。那不是 告诉你为什么跑./a.out失败了 找到/path/to/libtest.so本身。查看共享库依赖项 在a.out,运行ldd a.out