LinuxSir.cn,穿越时空的Linuxsir!

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

一个关于简单函数调用的问题,百思不得其解

[复制链接]
发表于 2006-3-31 10:19:53 | 显示全部楼层 |阅读模式
#include <stdio.h>
#include <math.h>

int main(void)
{
float pi ;
float pisqrt;

pi = M_PI;
pisqrt = sqrtf(2.0);

printf("pi=%f\n",pi);
printf("pisqrt = %f\n",pisqrt);

return 0;
}
正确:
[root@zhangyong develop]# gcc study.c -o study
[root@zhangyong develop]# ./study
pi=3.141593
pisqrt = 1.414214
[root@zhangyong develop]#


但是,下面这样就不行了:
#include <stdio.h>
#include <math.h>

int main(void)
{
float pi ;
float pisqrt;

pi = M_PI;
pisqrt = sqrtf(pi );//<-----------这里不同

printf("pi=%f\n",pi);
printf("pisqrt = %f\n",pisqrt);

return 0;
}
结果:
[root@zhangyong develop]# gcc study.c -o study
/tmp/cc4RsxZ7.o(.text+0x2b): In function `main':
: undefined reference to `sqrtf'
collect2: ld returned 1 exit status
[root@zhangyong develop]#


初学LINUX编程,还望大家多多关照!
发表于 2006-3-31 10:39:28 | 显示全部楼层
gcc study.c -lm -o study
回复 支持 反对

使用道具 举报

发表于 2006-3-31 10:51:33 | 显示全部楼层
问题估计出在那个宏M_PI上, 是不是编进库里头了

/* Some useful constants.  */
[color="Red"]#if defined __USE_BSD || defined __USE_XOPEN
# define M_E                2.7182818284590452354        /* e */
# define M_LOG2E        1.4426950408889634074        /* log_2 e */
# define M_LOG10E        0.43429448190325182765        /* log_10 e */
# define M_LN2                0.69314718055994530942        /* log_e 2 */
# define M_LN10                2.30258509299404568402        /* log_e 10 */
# define M_PI                3.14159265358979323846        /* pi */
# define M_PI_2                1.57079632679489661923        /* pi/2 */
# define M_PI_4                0.78539816339744830962        /* pi/4 */
# define M_1_PI                0.31830988618379067154        /* 1/pi */
# define M_2_PI                0.63661977236758134308        /* 2/pi */
# define M_2_SQRTPI        1.12837916709551257390        /* 2/sqrt(pi) */
# define M_SQRT2        1.41421356237309504880        /* sqrt(2) */
# define M_SQRT1_2        0.70710678118654752440        /* 1/sqrt(2) */
#endif

看来M_PI不在你的实现协议(POSIX?)内定义的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-31 11:23:02 | 显示全部楼层

还是不对,我作了新的测试,和宏定义无关

#include <stdio.h>
#include <math.h>

int main(void)
{
float pi ;
float pisqrt;

pi = 3.14;
pisqrt = sqrtf(3.14 );//<-----------这里不同

printf("pi=%f\n",pi);
printf("pisqrt = %f\n",pisqrt);

return 0;
}
结果正常:
[root@zhangyong develop]# make
gcc -c study.c -o study.o
gcc study.o -o study
[root@zhangyong develop]# ./study
pi=3.140000
pisqrt = 1.772004
[root@zhangyong develop]#

而改成变量,就不对了
#include <stdio.h>
#include <math.h>

int main(void)
{
float pi ;
float pisqrt;

pi = 3.14;
pisqrt = sqrtf(pi);//<-----------这里不同

printf("pi=%f\n",pi);
printf("pisqrt = %f\n",pisqrt);

return 0;
}
结果:
[root@zhangyong develop]# make
gcc -c study.c -o study.o
gcc study.o -o study
study.o(.text+0x2b): In function `main':
: undefined reference to `sqrtf'
collect2: ld returned 1 exit status
make: *** [study] 错误 1
[root@zhangyong develop]#
回复 支持 反对

使用道具 举报

发表于 2006-3-31 12:28:54 | 显示全部楼层
是不是链接器的问题?
请版主和高手们看看吧
回复 支持 反对

使用道具 举报

发表于 2006-3-31 12:39:47 | 显示全部楼层
加 -lm 参数:
gcc -lm study.o -o study
---------------------------
aliff 已经说过了。。。
还不行?
回复 支持 反对

使用道具 举报

发表于 2006-3-31 13:25:13 | 显示全部楼层
第一个程序没加 -lm [color="Red"]为什么可以编译通过,第二个程序只有微不足道的区别,却编译不过。这才是奇怪的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-31 13:28:50 | 显示全部楼层

加 -lm 还是不行

加 -lm 还是不行
回复 支持 反对

使用道具 举报

发表于 2006-3-31 13:45:46 | 显示全部楼层
我这里加-lm没问题
不过第一个不加-lm能通过确实比较奇怪
回复 支持 反对

使用道具 举报

发表于 2006-3-31 13:51:33 | 显示全部楼层
pisqrt = sqrtf(2.0); 可能被编译器直接处理成pisqrt = 1.414214;了
回复 支持 反对

使用道具 举报

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

本版积分规则

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