RqSHg 发表于 2013-01-24 21:07

gcc 的-lm选项是什么意思?

各位好
初学linux和gcc,C代码调用math.h中的函数有问题,如sqrt函数。若如sqrt(3.0)则可以编译通过并运行正常,若如sqrt(n),这里n是定义好的double型变量,则不能编译通过,错误信息为:undefined reference to `sqrt'。
上网查到加"-lm",在编译时候果然通过了。请问-lm是什么选项?有没有类似的功能?
gcc的手册太长啦,大致看看也没找到这个。
谢谢各位

crazyhadoop 发表于 2013-01-25 08:20

编译的时候,链接 数学库, -lptread 链接线程库等等,有好多,可以使自己编译的库

MMMIX 发表于 2013-01-25 12:38

RqSHg 发表于 2013-01-24 21:07 static/image/common/back.gif
gcc的手册太长啦,大致看看也没找到这个。
你应该搜索以 -l 打头的选项。

MMMIX 发表于 2013-01-25 12:40

RqSHg 发表于 2013-01-24 21:07 static/image/common/back.gif
初学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。

RqSHg 发表于 2013-01-26 11:55

回复 4# MMMIX


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

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

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

MMMIX 发表于 2013-01-27 08:19

RqSHg 发表于 2013-01-26 11:55 static/image/common/back.gif
谢谢回复,原来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 (靜態庫)。

litblakit 发表于 2013-02-15 17:50

-l specifies the library you want use

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

大概是这样吧:D

RqSHg 发表于 2013-02-15 19:35

啊,谢谢各位,这回挺清楚了

到这里,下面打算学学静态与动态链接库的相关内容
有不会的再来问
页: [1]
查看完整版本: gcc 的-lm选项是什么意思?