为什么 makefile 中需要链接 math.h 而不是 string.h?

tar*_*yte 5 c linker makefile

我已经<string.h>在所有地方都包含了,当我去包含时,我<math.h>发现pow()我需要修改我的 makefile 才能访问pow.

如果我需要包含它们,我也不知道在哪里可以查找更多库。我随机读到该-lm标志(或至少是m它的标志)表示标准 c 数学库,但我不知道其他标准 c 库可能被称为什么。

我刚刚查看了一下,user/local/lib我看到的只是:

$ cd /usr/local/lib
$ ls -al
drwxr-xr-x  3 root root  4096 Apr 25  2012 .
drwxr-xr-x 10 root root  4096 Apr 25  2012 ..
drwxrwsr-x  4 root staff 4096 Oct 14 10:19 python2.7
Run Code Online (Sandbox Code Playgroud)

Edw*_*uck 6

string.h是对标准库模块的标头引用,但由于历史原因math.h不是对标准库模块的标头引用。编译程序时,链接器中通常默认包含标准库。

在某个时间点,人们可能会libm.so math.h用其他针对内存、CPU 性能等进行了更好优化的实现来替代实现。实际上,不存在单一的libm.so“默认”实现。然而,大多数系统至少提供了一个实现。该实现位于默认库位置,并将libm.so与 链接-lm

如果您有一个更快(甚至可能以不太准确为代价)的库并且您知道可以使用,您就可以覆盖系统提供的math.h libm.so实现。

早期的 CRAY 系统(我没有开发过)确实优化了一些数学实现,以不进行正确的“完整”数学运算,因为要获得 100% 正确的答案,您需要使用以下命令“完成”组装操作由于计算中有效数字的数量,这些代码通常并不重要。(根据我对华盛顿特区密码学博物馆展览的理解)

多种实现的问题是您现在有一个选择,而标准 C 库的结构不为您提供实现的选择。