C 生成共享对象库:ldd不显示指定的名称
我正试图在Debian上构建一个共享对象库C 生成共享对象库:ldd不显示指定的名称,c,gcc,shared-libraries,shared-objects,ldd,C,Gcc,Shared Libraries,Shared Objects,Ldd,我正试图在Debian上构建一个共享对象库 cat /etc/issue Debian GNU/Linux 9 \n \l 我按照正常方式构建库和对象(wrap.c用作创建所有对象文件的包装器) 然后,我创建一个test.c,以拉入库并成功编译,如下所示: gcc test.c-ltest 但是,运行程序/a.out会返回以下错误: ./a.out:加载共享库时出错:libtest.so:无法打开共享对象文件:没有此类文件或目录 检查.so,我看到: $ ldd /path/to/libtes
cat /etc/issue
Debian GNU/Linux 9 \n \l
我按照正常方式构建库和对象(wrap.c
用作创建所有对象文件的包装器)
然后,我创建一个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
,这至少会告诉我它找不到库
我真的不确定这里发生了什么
我将使用相同的过程(使用
gcc-dynamiclib-o libtest.dylib*.o
)在macOS
上成功创建.dylib
,并且我可以在可执行文件中成功调用库。我不确定Debian上有什么不同。共享库libtest。所以您放置了
在/usr/local/lib中,链接器将在
命令
因为/usr/local/lib
是链接器的默认搜索之一
路径
但是,运行时加载器不会在那里找到它
当您尝试运行/a.out
时,因为运行时
加载器不直接搜索除
变量LD\u LIBRARY\u PATH
的值中列出的值(如果有),
在当前的环境中。默认情况下,它搜索库
注册于
缓存,并更新该缓存以注册新出现的库
仅通过以root用户身份运行ldconfig
因此,要运行您的程序,您有两个选项:-
要在当前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
我建议使用-Wl,-rpath,/usr/local/lib
@Mike Kinghan-Doh….设置at链接时间。。。。!我完全疯了,说我是在库上使用ldd,而不是在可执行文件上。出于某种原因,这让我完全失去了兴趣。感谢你的洞察力!
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib; ./a.out
sudo ldconfig