<stdio.h> vs <math.h> - 为什么你要链接一个而不是另一个?

And*_*085 3 c

我很困惑为什么你必须输入-lm来正确地将数学链接到你的代码,但是不必为stdio做同样的事情.我刚刚开始使用C,所以如果这是一个愚蠢的问题,我会道歉,或者我错过了一些明显的东西.

Yu *_*Hao 5

简而言之,由于历史原因,

在这些功能stdio.h都在libc,而在功能math.h都在libm.libc默认链接但libm不是.


Mih*_*eac 3

有两件事不同:

  • 头文件 (stdio.hmath.h) - 它们仅包含函数原型和一些定义和数据;它们在你的源代码#include
  • 库 ( libm.so) - 它们包含二进制代码,这些代码将链接回您的应用程序(二进制代码)。另外,对于名为的库,libname.so链接器标志是-lname- 对于libm.so标志是-lm

还要考虑到有libc.solibstdc.so始终链接到您的应用程序。stdio.h和以及其他几个函数的代码stdlib.h可以在这些库中找到 - 因此,它总是包含在内。

PS:我在这里假设Linux/UNIX,因此名称非常具体。在 Windows 上,情况类似,但名称不同(DLL 而不是.so文件等)