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的事实有关。