C ldd显示libm.so.6,但仍需要使用-lm链接

C ldd显示libm.so.6,但仍需要使用-lm链接,c,gcc,linker,lm,ldd,C,Gcc,Linker,Lm,Ldd,我构建了一个库,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 symbo

我构建了一个库,
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
,编译才会成功


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

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

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


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

感谢您的回答!但是如果我使用g++(不使用-lm)编译,编译就会成功。为什么会这样?我认为这与LISSTDC++ ++引用LBM的事实有关。 G++< /COD>前端自动链接<代码> LBM。所以因为C++标准库(<代码> LBSTDC++<代码>)需要它——但是C库不是这样。理想情况下,不需要与数学库链接,但出于历史原因。我明白了。再次感谢你!