当前位置:首页 > > 21ic电子网
[导读]你知道,为什么在C中使用了pow函数不需要链接libm库吗?什么情况需要指定链接库?在解释之前,先回顾一下。//来源:公众号【编程珠玑】//https://www.yanbinghu.com#include#includeint main(void){    int b = 2;...

你知道,为什么在C 中使用了pow函数不需要链接libm库吗?

什么情况需要指定链接库?

在解释之前,先回顾一下。

//来源:公众号【编程珠玑】
//https://www.yanbinghu.com
#include
#include
int main(void)
{
    int b = 2;
    double a = pow(b,b);
    printf("%f\n",a);
    return 0;
}
代码本身比较简单,pow(x,y)用于计算x的y次幂。

这里由于pow函数并不在lib库中,默认情况下,编译的时候只链接了libc库,因此如果不指定链接库,则会报错:

$ gcc -o test test.c
/tmp/ccKDgtzz.o: In function `main':
test.c:(.text 0x22): undefined reference to `pow'
collect2: error: ld returned 1 exit status
从报错信息来看,我们知道是找不到pow函数的定义。

通过man手册也可以查看到,编译是需要包含头文件math.h和链接数学库的:

$ man pow
       #include 

       double pow(double x, double y);
       float powf(float x, float y);
       long double powl(long double x, long double y);

       Link with -lm.
即像下面这样是可以的:

$ gcc -o test test.c -lm
$ ./test
4.000000
gcc在编译的时候默认链接的是libc库,其他库需要手动指定。

但是,看下面的代码:

//来源:公众号【编程珠玑】
//作者:守望先生
#include
#include
int main()
{
    int b = 2;
    double a = pow(b,b);
    std::cout::endl;
    return 0;
}
编译运行:

$ g  -o test test.cpp
$ ./test
4

我们并没有手动指定链接库,但是却可以编译过!

那么,问题来了!

为何在C 中使用pow函数不需要手动指定链接数学库libm,而C里面却需要呢?

为了解答这个问题,我们必须知道C 的程序中,到底有没有链接libm库。如何查看呢?还记得在《linux常用命令-开发调试篇》中提到的ldd吗?它可以查看当前程序链接了哪些动态库:

$ ldd test
    linux-vdso.so.1 =>  (0x00007ffd41bda000)
    libstdc .so.6 => /usr/lib/x86_64-linux-gnu/libstdc .so.6 (0x00007f6230cca000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f62309c1000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f62305f7000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f623104c000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f62303e1000)
看到没有,除了链接了最基本的libstdc 库,还链接了libc和libm库!也就是说,虽然没有手动指定链接,但是实际上还是链接了。但是这是什么时候链接上的呢?

我们再看libstdc 的链接库发现:

$ ldd /usr/lib32/libstdc .so.6
    linux-gate.so.1 =>  (0xf7f92000)
    libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf7da6000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7bf0000)
    /lib/ld-linux.so.2 (0xf7f94000)
    libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xf7bd3000)
看见没有!原来是libstdc 已经链接了libm库,这也就解释了为什么C 代码中不需要手动指定链接数学库libm。

总结:

通过前面的内容我们总结如下:

  • C代码编译时,通常会默认链接libc库

  • C 代码编译时,通常会默认链接libstdc 库

  • 由于libstdc 中有依赖一些数学函数或者libc库中的函数,因此默认链接了libc库和libm库。



作者:守望先生来源:编程珠玑版权归原作者所有,如有侵权,请联系删除。

21ic电子网

扫描二维码,关注更多精彩内容

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

首个采用高分辨率太阳观测数据训练的太阳物理学人工智能 (AI) 基础模型,旨在深入探索太阳动态表面,对可能干扰地球和太空技术的太阳天气做出有效规划。 该模型已发布在 Hugging Face 开源平台,旨在加快...

关键字: IBM NASA 开源 模型

多数受访粉丝认为,AI驱动的功能会对他们观看体育赛事的方式产生重大影响 超过半数的受访者希望通过AI技术获得对过去、现在和未来体育赛事的评论和分析 移动体育应用...

关键字: IBM AI 应用程序 移动

-LambdaTest推出全球首个AI智能体测试平台:引入智能体对智能体测试 AI原生多智能体系统提供更智能、更快、更全面的软件测试 旧金山2025年8月20日 /美通社...

关键字: 智能体 测试平台 TEST AI

- ‘Match Chat' AI助手可在所有254场单打比赛期间及结束后实时回答问题 - 升级版IBM SlamTracker将提供实时获胜概率预测,而‘Key Poin...

关键字: IBM AI PEN AN

尽管全球数据泄露的平均成本降至 444 万美元,美国企业的相关损失却攀升至 1022 万美元; 在遭遇数据泄露的企业中,仅有 49% 的企业计划加强安全投入。...

关键字: AI IBM 控制 模型

北京2025年7月31日 /美通社/ -- 日前,"X-Power IBM赋能创新中心"在苏州工业园区正式启动运营,标志着IBM中国与艾科斯幂(苏州)信息科技有限公司(以下简称"X-Powe...

关键字: IBM POWER 数字化 自动化技术

85%企业宣称做好了AI准备,但实际就绪者仅达11% IBM 最新研究揭示阻碍工业 4.0 成熟和迈向工业 5.0 的关键差距 北京2025年7月23日 /美通...

关键字: AI IBM BSP 人工智能

作者:吴敏达,IBM科技事业部数据与人工智能资深技术专家 作者简介:吴敏达是 The Open Group 卓越级技术专家(Distinguished Technical...

关键字: AI IBM 智能体 UG

北京 2025年7月16日 /美通社/ -- 中国企业出海正经历深刻转型:不再只是把产品卖到海外,而是将研发、设计、生产、销售、服务等全价值链带到全球,实现真正的"全球本地化"。然而,在走向全球的过...

关键字: IBM 亚马逊 BSP CK

 作者:左朝国,IBM混合集成平台与数据集成业务北亚销售总监  北京 2025年7月10日 /美通社/ -- 在新的AI时代,中国制造业正处于从"制造大国"向"智造强国"...

关键字: IBM 中国制造 数字化 无缝集成
关闭