【问题标题】:ldd shows libm.so.6 but still linking with -lm is neededldd 显示 libm.so.6 但仍需要与 -lm 链接
【发布时间】:2020-07-16 12:18:34
【问题描述】:

我建立了一个库,ldd 显示它引用了libm.so.6

 ldd liba.so 
        ...  
        libm.so.6 => /lib64/libm.so.6 (0x00007fdf53e85000)
        ...

但是当我编译我的程序时,我得到:

$ gcc mytest.c -I/path/to/a/header -L/home/path/to/a/so  -la 
/usr/bin/ld: undefined reference to symbol 'sin@@GLIBC_2.2.5'
//usr/lib64/libm.so.6: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

只有当我在后一个命令的末尾附加-lm 时,编译才会成功。

如果libm.so.6 显示为ldd,为什么会这样?为什么错误可能包含/usr/lib64/libm.so.6 而不是/lib64/libm.so.6?谢谢。

【问题讨论】:

    标签: c gcc linker lm ldd


    【解决方案1】:

    ldd 列出了liba.so 所需的共享对象 - 动态链接器 (ld.so) 将使用这些对象。但是您得到的错误来自静态链接器 (ld)。

    liba.solibm.so 的依赖与 ld 在尝试解析符号并将可执行文件链接在一起时无关 - 尽管您链接了 liba.so

    对于ldliba.so 是另一个用于查看未解析符号的库 - 它不会查看 liba.so 的所有依赖项。

    【讨论】:

    • 感谢您的回答!但是如果我用 g++(不带 -lm)编译,编译成功。为什么会这样?我认为这与 libstdc++ 引用 libm 的事实有关。
    • g++ 前端会自动链接 libm.so,因为 C++ 标准库 (libstdc++) 需要它 - 但 C 库并非如此。理想情况下,根本不需要与数学库链接,除非出于历史原因。
    • 我明白了。再次感谢您!
    猜你喜欢
    • 2016-03-08
    • 2022-12-12
    • 2021-08-08
    • 2020-05-07
    • 2021-03-21
    • 2022-08-04
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    相关资源
    最近更新 更多