【问题标题】:building a shared object library: ldd does not show specified name构建共享对象库:ldd 不显示指定名称
【发布时间】:2018-02-23 18:30:33
【问题描述】:

我正在尝试在 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,这至少会告诉我它找不到库。

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

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

【问题讨论】:

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


    【解决方案1】:

    你放置的共享库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

    【讨论】:

    • 我建议在链接时将rpath 设置为-Wl,-rpath,/usr/local/lib
    • @Mike Kinghan Doh....!我完全放屁,我在库上使用 ldd 而不是可执行文件。出于某种原因,这让我彻底失望了。欣赏洞察力!
    猜你喜欢
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多