【问题标题】:<stdio.h> vs <math.h> - Why do you have to link one and not the other? [duplicate]<stdio.h> vs <math.h> - 为什么你必须链接一个而不是另一个? [复制]
【发布时间】:2013-08-05 18:43:05
【问题描述】:

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

【问题讨论】:

标签: c


【解决方案1】:

总之,由于历史原因,

stdio.h 中的函数在libc 中,而math.h 中的函数在libm 中。 libc 默认链接,libm 没有链接。

【讨论】:

  • s/was/is/,是正确的。
  • 历史原因是,虽然几乎每个人都需要libc 中的代码,但只有少数应用程序需要libm 中的代码。
【解决方案2】:

有两种不同的东西:

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

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

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

【讨论】:

  • libm.solibc.so 等名称是非常特定于系统的。但是使用-lm 链接数学库的要求也是如此。
  • 谢谢,在 PS 中提到过。
猜你喜欢
  • 2019-09-07
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
  • 2015-04-23
  • 1970-01-01
相关资源
最近更新 更多