Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 生成共享对象库:ldd不显示指定的名称_C_Gcc_Shared Libraries_Shared Objects_Ldd - Fatal编程技术网

C 生成共享对象库:ldd不显示指定的名称

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

我正试图在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/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