您已经使用正确的 math.h 头文件的引用编译了代码,但是当您尝试链接它时,您忘记了包含数学库的选项。因此,您可以编译 .o 目标文件,但不能构建可执行文件。
正如 Paul 已经提到-lm
的,在您尝试生成可执行文件的步骤中添加“”以链接到数学库。
在评论中,linuxD询问:
为什么对于sin()
in <math.h>
,我们是否需要-lm
明确的选项?但是,不适合printf()
in<stdio.h>
吗?
因为这两个功能都是作为“单一 UNIX 规范”的一部分实现的。这个标准的历史很有趣,并且有很多名字(IEEE Std 1003.1、X/Open Portability Guide、POSIX、Spec 1170)。
该标准专门将“标准 C 库”例程与“标准 C 数学库”例程(第 277 页)分开。相关段落抄录如下:
标准 C 库
自动搜索标准 C 库
cc
以解析外部引用。该库支持第 1 卷中定义的基本系统的所有接口,但数学例程除外。
标准 C 数学库
此库支持第 1 卷中定义的基本系统数学例程。该cc
选项
-lm
用于搜索此库。
这种分离背后的原因受到许多因素的影响:
- UNIX 战争导致与最初的 AT&T UNIX 产品的分歧越来越大。
- UNIX 平台的数量增加了为操作系统开发软件的难度。
- 发起了为软件开发人员定义最低公分母的尝试,称为 1988 POSIX。
- 软件开发人员针对 POSIX 标准进行编程,以在“符合 POSIX 的系统”上提供他们的软件,以达到更多平台。
- UNIX 客户要求“符合 POSIX 标准”的 UNIX 系统来运行该软件。
决定放入不同图书馆的压力-lm
可能包括但不限于:
- 这似乎是减小 libc 大小的好方法,因为许多应用程序不使用嵌入在数学库中的函数。
- 它为数学库实现提供了灵活性,其中一些数学库依赖于较大的嵌入式查找表,而其他数学库可能依赖于较小的查找表(计算解决方案)。
- 对于真正大小受限的应用程序,它允许以非标准方式重新实现数学库(例如将其拉出
sin()
并将其放入自定义构建的库中。
无论如何,它现在是标准的一部分,不会自动包含在 C 语言中,这就是为什么您必须添加-lm
.