如果我在C程序中包含<stdlib.h>
或<stdio.h>
,我在编译时不必链接它们,但我必须链接到<math.h>
,使用-lm
和gcc,例如:
gcc test.c -o test -lm
原因是什么?为什么我必须显式链接数学库而不是其他库?
如果我在C程序中包含<stdlib.h>
或<stdio.h>
,我在编译时不必链接它们,但我必须链接到<math.h>
,使用-lm
和gcc,例如:
gcc test.c -o test -lm
原因是什么?为什么我必须显式链接数学库而不是其他库?
和stdio.h
中的函数都有libc.so
中的实现(或者静电链接的libc.a
中的实现),默认情况下链接到您的可执行文件中(就像指定了-lc
一样).可以指示GCC避免与第-nostdlib
或-nodefaultlibs
选项的这种自动链接.
math.h
中的数学函数有libm.so
中的实现(或者静电链接的libm.a
中有libm.a
中的实现),默认情况下,libm
中没有链接.libm
/libc
的分裂是有历史原因的,但没有一个很有说服力.
有趣的是,C++运行时libstdc++
需要libm
,所以如果你用GCC(g++
)编译C++程序,你会自动获得libm
链接.