为什么必须在C中链接数学库?

如果我包含<stdlib.h>包含<stdio.h>在C程序中,则在编译时不必链接这些,但是我必须链接到<math.h>,并-lm与gcc一起使用,例如:

gcc test.c -o test -lm

这是什么原因呢?为什么我必须显式链接数学库,而不是其他库?

短暂的

在功能stdlib.hstdio.h在实现libc.so(或libc.a静态链接),它在默认情况下链接到你的可执行文件(好像-lc被指定)。可以指示GCC避免使用-nostdlib-nodefaultlibs选项进行此自动链接

中的数学函数math.h具有的实现libm.so(或libm.a用于静态链接),并且libm默认情况下未链接。这种libm/libc分裂有历史原因,但没有一个非常令人信服。

有趣的是,C ++运行时libstdc++需要libm,因此,如果您使用GCC(g++编译C ++程序,则将自动获得libm链接。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么必须在C ++类定义中声明方法?

为什么必须在数据库中明确指定外键和引用?

为什么我必须在ActionScript Project中手动添加Flex库

为什么我必须在客户端库中公开宏实现的“使用”?

为什么必须在onChanged(在Flutter中)中调用didChange?

为什么我们必须在C#中同时定义==和!=?

为什么必须在foreach C#中显式声明ListItem

为什么我们必须在Java脚本(Razor)中对C#代码使用引号

2 维数组。为什么我必须在 C 中声明列的大小

为什么const必须在typescript中的export类之外?

为什么必须在类中调用_internal()?

为什么我必须在onLoaderReset中交换swapCursor(null)?

为什么Reactjs必须在HOC中重用代码?

为什么必须在类定义中编写引发异常?

为什么现在必须在Swift中覆盖我的init?

为什么必须在function()中包含对函数的调用

为什么必须在子类中重新声明PoolDictionaries?

为什么必须在`yield`的场景中添加分号

JS 承诺:为什么 await 必须在异步函数中?

为什么方法varargs必须在Java的单独块中?

C#编写剪贴板监视器:为什么必须在WinForm中覆盖WndProc

为什么我必须在C ++中的std :: array <SomeStruct,size>初始化时为每个项目指定类型

为什么必须在符号名称中修饰返回类型中的decltype表达式?

在angular2中动态加载组件时,为什么必须在容器中写入目标?

为什么在Mingw中设置sdl时必须在主要函数中传递参数?

为什么文本I / O必须在python 3中进行缓冲?

在Python中,当我使用upper方法时,为什么我必须在upper之后放()?

使用扫描仪读取文件时,为什么扫描仪必须在方法中?

为什么必须在ASP.NET MVC中“连接”依赖项注入?