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

building a shared object library: ldd does not show specified name

我正在尝试在 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.outreturns出现如下错误:

./a.out: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory

检查 .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,这至少告诉我它找不到图书馆。

我不太确定这是怎么回事。

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

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

gcc test.c -ltest

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

但是,它不会被运行时间加载程序定位到那里 当您尝试 运行 ./a.out 因为 运行 时间 loader 不直接搜索目录 那些在变量 LD_LIBRARY_PATH 的值中列出的,如果有的话, 在现在的环境下。默认情况下它搜索库 注册于 ldconfig 缓存,并且该缓存被更新以注册新出现的库 仅 运行ning 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 的共享库依赖项。那不是 会告诉你为什么 运行ning ./a.out 失败 找到 /path/to/libtest.so 本身。查看共享库依赖项 共 a.out、运行 ldd a.out