ldd 显示 libm.so.6 但仍需要与 -lm 链接

ldd shows libm.so.6 but still linking with -lm is needed

我构建了一个库,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.6ldd显示?为什么错误可能包含 /usr/lib64/libm.so.6 而不是 /lib64/libm.so.6?谢谢。

ldd 列出 liba.so 所需的共享对象 - 动态 linker (ld.so). But the error you get is from the static linker (ld).

将使用的内容

liba.solibm.so 的依赖与 ld 无关,因为它试图同时解析符号和 link 可执行文件 - 尽管事实上你linkliba.so.

对于 ldliba.so 是另一个用于查找未解析符号的库 - 它不查看 liba.so.

的所有依赖项