LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 719|回复: 5

问一个简单fedora 3中的的C中的头文件问题

[复制链接]
发表于 2005-3-20 17:20:34 | 显示全部楼层 |阅读模式
我使用的是FC3,在下作简单的C编程。
在程序开头引用#include <math.h>之后,然后再引用函数sqrt(),也就开方的数学函数,编译中居然说找不到sqrt()这个函数。
我查看了一个/usr/lib/math.h,果然没有找到sqrt()的原型,
真是太奇怪了,我在安装 fc3时选择了软件开发包组。
请高手指点

以下是相关软件包的查询结果:
[fedora@server c_source]$ rpm -qa|grep -i GLIB
glibc-devel-2.3.3-74
glibc-2.3.3-74
glib2-2.4.7-1
dbus-glib-0.22-10
glib-1.2.10-15
glibc-headers-2.3.3-74
glibc-common-2.3.3-74
glibc-kernheaders-2.4-9.1.87
[fedora@server c_source]$
发表于 2005-3-20 19:06:08 | 显示全部楼层
应该可以的。math.h应是/usr/include/math.h。而sqrt定义在/usr/include/bits/mathcalls.h里的一个宏里。它被math.h包含。
头文件在glibc-headers-*.rpm中。应该可以编译。
如果你出错了有可能你少一个glib2-devel-*.rpm。
gcc默认找最新的开发包。但你没有。glib-devel-*.rpm是为了向前兼容。一般gcc不会去连它。除非你用参数指明。
回复 支持 反对

使用道具 举报

发表于 2005-3-20 19:19:48 | 显示全部楼层
这个不关事!不是没装什么软件的关系!
问题的解决也是很简单的!
你在用下面的命令来编译

gcc *.c -lm

这个函数的库要自己手动连接的!
为什么哩,看看这个sqrt的man手册中有这样一句话:

Link with -lm

就是说编译时要手动连接库。

其他的函数也会在man手册里有说明的!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-20 20:24:39 | 显示全部楼层
Post by leros_H
这个不关事!不是没装什么软件的关系!
问题的解决也是很简单的!
你在用下面的命令来编译

gcc *.c -lm

这个函数的库要自己手动连接的!
为什么哩,看看这个sqrt的man手册中有这样一句话:

Link with -lm

就是说编译时要手动连接库。

其他的函数也会在man手册里有说明的!


问题解决了,兄弟说得很正确。果然编译通过了。
不过,在我的fedora 3上的man 文档上根本就没有提到 link with -lm这句话。
是不是有些linux发行版的man文档也有些不一样?
以下是我机子上的sqrt的man文档的全文

SQRT(3)                    Linux Programmer<E2><80><99>s Manual                   SQRT(3)

NAME
       sqrt, sqrtf, sqrtl - square root function

SYNOPSIS
       #include <math.h>

       double sqrt(double x);

       float sqrtf(float x);

       long double sqrtl(long double x);

DESCRIPTION
       The  sqrt()  function  returns  the  non-negative square root of x.  It
       fails and sets errno to EDOM, if x is negative.

ERRORS
       EDOM   x is negative.

CONFORMING TO
       SVID 3, POSIX, BSD 4.3, ISO 9899.  The float and the long double  vari-
       ants are C99 requirements.

SEE ALSO
       hypot(3)

                                  2002-07-27                           SQRT(3)
~
~
(END)
回复 支持 反对

使用道具 举报

发表于 2005-3-20 20:42:58 | 显示全部楼层
math库中的函数在世链接时都要加上-lm。
回复 支持 反对

使用道具 举报

发表于 2005-3-21 09:54:00 | 显示全部楼层
不过,在我的fedora 3上的man 文档上根本就没有提到 link with -lm这句话。
是不是有些linux发行版的man文档也有些不一样?

我用的是debian,这个man手册是我自己去网上下载回来自己装,叫man-pages-2.01.tar.bz2。以下就是那个sqrt()的部分内容:

SYNOPSIS
       #include <math.h>

       double sqrt(double x);
       float sqrtf(float x);
       long double sqrtl(long double x);

       Link with -lm.
DESCRIPTION
       The  sqrt()  function  returns  the  non-negative square root of x.  It
       fails and sets errno to EDOM, if x is negative.

不知道为什么你的手册里没有了!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表