免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 29304 | 回复: 7
打印 上一主题 下一主题

[Linux] gcc 的-lm选项是什么意思? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-24 21:07 |只看该作者 |倒序浏览
各位好
初学linux和gcc,C代码调用math.h中的函数有问题,如sqrt函数。若如sqrt(3.0)则可以编译通过并运行正常,若如sqrt(n),这里n是定义好的double型变量,则不能编译通过,错误信息为:undefined reference to `sqrt'。
上网查到加"-lm",在编译时候果然通过了。请问-lm是什么选项?有没有类似的功能?
gcc的手册太长啦,大致看看也没找到这个。
谢谢各位

论坛徽章:
1
天蝎座
日期:2013-12-06 18:23:58
2 [报告]
发表于 2013-01-25 08:20 |只看该作者
编译的时候,链接 数学库, -lptread 链接线程库  等等,有好多,可以使自己编译的库

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
3 [报告]
发表于 2013-01-25 12:38 |只看该作者
RqSHg 发表于 2013-01-24 21:07
gcc的手册太长啦,大致看看也没找到这个。

你应该搜索以 -l 打头的选项。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2013-01-25 12:40 |只看该作者
RqSHg 发表于 2013-01-24 21:07
初学linux和gcc,C代码调用math.h中的函数有问题,如sqrt函数。若如sqrt(3.0)则可以编译通过并运行正常,若如sqrt(n),这里n是定义好的double型变量,则不能编译通过,错误信息为:undefined reference to `sqrt'。


像 sqrt(3.0); 这种调用,gcc 在编译时就可以将其替换为对应的值(gcc 优化的一部分),从而不需要链接 sqrt 所在的数学库 libm;而像 sqrt(n); 这种调用,一般无法做这种替换,因此需要链接 libm。

论坛徽章:
0
5 [报告]
发表于 2013-01-26 11:55 |只看该作者
回复 4# MMMIX


   
谢谢回复,原来gcc编译时还有这样的功能
我查了手册,有这样的描述:

"-llibrary
连接名为library的库文件.
连接器在标准搜索目录中寻找这个库文件,库文件的真正名字是`liblibrary.a'.连接器会 当做
文件名得到准确说明一样引用这个文件."

是不是这个?
我目前简单理解就是,-l后面跟什么,就是链接什么库
楼上说还有-lpthread 是不是还有-llibc++?
但我用的数学库是math.h啊,为什么只写-lm就知道是数学库?简写?
还有上面说的那个'liblibrary.a'又是什么?

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
6 [报告]
发表于 2013-01-27 08:19 |只看该作者
RqSHg 发表于 2013-01-26 11:55
谢谢回复,原来gcc编译时还有这样的功能
我查了手册,有这样的描述:

"-llibrary
连接名为library的库文件.
连接器在标准搜索目录中寻找这个库文件,库文件的真正名字是`liblibrary.a'.连接器会 当做
文件名得到准确说明一样引用这个文件."

是不是这个?

是的。

我目前简单理解就是,-l后面跟什么,就是链接什么库

是的。

楼上说还有-lpthread 是不是还有-llibc++?

libstdc++.so 也是有的,但用 g++ 編譯 C++ 代碼時,會自動鏈接這個庫,就如用 gcc 編譯 C 代碼時會自動鏈接 libc.so 一樣。

但我用的数学库是math.h啊,为什么只写-lm就知道是数学库?简写?

數學庫的實現位於 libm.so 中,鏈接它只需寫 -lm 即可。

还有上面说的那个'liblibrary.a'又是什么?


在 -llibrary 中,library 是庫的名子(這就是個例子),對應的庫文件是 liblibrary.so (動態庫)或 liblibrary.a (靜態庫)。

论坛徽章:
0
7 [报告]
发表于 2013-02-15 17:50 |只看该作者
-l specifies the library you want use

m for libm.so / libm.a
abc for libabc.so / libabc.a

大概是这样吧

论坛徽章:
0
8 [报告]
发表于 2013-02-15 19:35 |只看该作者
啊,谢谢各位,这回挺清楚了

到这里,下面打算学学静态与动态链接库的相关内容
有不会的再来问
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP