LinuxSir.cn,穿越时空的Linuxsir!

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

C头文件问题

[复制链接]
发表于 2006-8-20 11:23:00 | 显示全部楼层 |阅读模式
源程序:

# cat T.c
#include <math.h>
#include <stdio.h>

int main()
{
        double a=4.0;
        printf("%f\n", sqrt(a));
        return 0;
}

编译报错:

# gcc -o T.o T.c
/tmp/cceqzKJ3.o: In function `main':
T.c.text+0x35): undefined reference to `sqrt'
collect2: ld returned 1 exit status

将a换为4.0,则正常编译并执行正确:

# cat T.c
#include <math.h>
#include <stdio.h>

int main()
{
        double a=4.0;
        printf("%f\n", sqrt(4.0));
        return 0;
}
#gcc -o T.o T.c
#./T.o
2.000000

我的OS是SUSE10.1,新手入门,百思不得其解,请大家指点。
谢谢!!!
发表于 2006-8-20 12:44:05 | 显示全部楼层
根本问题是你使用了数学库的头文件math.h,在编译的时候要手动链接这个动态库。
gcc -o t t.c -lm

至于为什么sqrt改成数字参数可以通过哩。偶也不知道。请另外的大牛解答吧!
回复 支持 反对

使用道具 举报

发表于 2006-8-20 14:38:32 | 显示全部楼层
sqrt(4.0) 应该是被优化成一个常数了,所以无须调用sqrt库函数
而sqrt(a) 则仍然保持库函数调用,所以必须用 -lm 参数链接

查看一下生成的汇编代码就知道了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-8-20 14:58:44 | 显示全部楼层

谢谢

果然如此,受教了。谢谢!
请问可以介绍几本在LINUX下C和C++程序设计的好书给我吗,想早日扫盲,不胜感激!
回复 支持 反对

使用道具 举报

发表于 2006-8-20 16:48:49 | 显示全部楼层
我最近也在看C++。先找本基础的来看,再找稍微高深点的,最后再看专家级的。
据说可以这样看:
essential c++等入门书籍  ---> c++ primer ----> effective c++ 和 eceptional c++ ----> thinking in c++ ----> stl 相关 、stl 源码剖析 ----> 设计模式 ----> ....

尽量不看国人写的
回复 支持 反对

使用道具 举报

发表于 2006-8-20 21:38:38 | 显示全部楼层
谢谢,我也要记录下这些书.....
回复 支持 反对

使用道具 举报

发表于 2006-8-20 23:05:49 | 显示全部楼层
补充一本我认为最重要的:
The C++ Programming Language, Special Edition, by Bjarne Stroustrup.
回复 支持 反对

使用道具 举报

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

本版积分规则

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