LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: kikiwarm

在linux用<math.h>的问题

[复制链接]
发表于 2006-2-15 19:46:07 | 显示全部楼层
kj501老大,我省略了-lm,是可以编译通过的。这确实让我不解。

  1. [matt@host source]$ cat main.c
  2. #include <stdio.h>
  3. #include <math.h>

  4. int main()
  5. {
  6. int i;
  7. i = pow(2,2);
  8. printf("2x2 is %d", i);

  9. return 0;
  10. }

  11. [matt@host source]$ gcc main.c
  12. [matt@host source]$ ./a.out
  13. 2x2 is 4[matt@host source]$
复制代码


在FC3(gcc 3.4.4) FC4(4.0.1)下都是以上这个结果。
其内在原因为何?:ask
回复 支持 反对

使用道具 举报

发表于 2006-2-15 20:13:21 | 显示全部楼层
你的 gcc 有定义成别名么?
回复 支持 反对

使用道具 举报

发表于 2006-2-16 08:57:02 | 显示全部楼层
Post by MatthewGong
kj501老大,我省略了-lm,是可以编译通过的。这确实让我不解。

  1. [matt@host source]$ cat main.c
  2. #include <stdio.h>
  3. #include <math.h>

  4. int main()
  5. {
  6. int i;
  7. i = pow(2,2);
  8. printf("2x2 is %d", i);

  9. return 0;
  10. }

  11. [matt@host source]$ gcc main.c
  12. [matt@host source]$ ./a.out
  13. 2x2 is 4[matt@host source]$
复制代码


在FC3(gcc 3.4.4) FC4(4.0.1)下都是以上这个结果。
其内在原因为何?:ask

在我的系统上,如果不加上-lm,编译时就会出错。我用的是gentoo linux。
你把gcc -v main.c的结果贴上来看看。
回复 支持 反对

使用道具 举报

发表于 2006-2-16 22:02:38 | 显示全部楼层
静态库需要-lxxx来连接,但是动态库不是运行时加载么?还需要编译时来链接么?
回复 支持 反对

使用道具 举报

发表于 2006-2-17 09:16:33 | 显示全部楼层
Post by jetking
静态库需要-lxxx来连接,但是动态库不是运行时加载么?还需要编译时来链接么?

要完成一个链接过程,可以分成两步走。首先是告诉连接器到那个库文件中去解析符号。其次是由连接器在指定的库文件中将符号解析相应的地址。静态链接时这两个步骤是一起完成的。动态链接把第二个步骤留到了运行时完成。但在编译时仍然要检查动态库文件是否能真正解析符号。
回复 支持 反对

使用道具 举报

发表于 2006-2-17 17:42:54 | 显示全部楼层
  1. [matt@localhost tmp]$ cat main.c
  2. #include <stdio.h>
  3. #include <math.h>
  4. int main()
  5. {
  6. int i;
  7. i = pow(2,2);
  8. printf("2x2 is %d", i);
  9. return 0;
  10. }
  11. [matt@localhost tmp]$ gcc -v main.c
  12. 使用内建 specs。
  13. 目标:i386-redhat-linux
  14. 配置为:../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,java,f95,ada --enable-java-awt=gtk --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --host=i386-redhat-linux
  15. 线程模型:posix
  16. gcc 版本 4.0.2 20051125 (Red Hat 4.0.2-8)
  17. /usr/libexec/gcc/i386-redhat-linux/4.0.2/cc1 -quiet -v main.c -quiet -dumpbase main.c -auxbase main -version -o /tmp/cckRAKQI.s
  18. 忽略不存在的目录“/usr/lib/gcc/i386-redhat-linux/4.0.2/../../../../i386-redhat-linux/include”
  19. #include "..." 搜索从这里开始:
  20. #include <...> 搜索从这里开始:
  21. /usr/local/include
  22. /usr/lib/gcc/i386-redhat-linux/4.0.2/include
  23. /usr/include
  24. 搜索列表结束。
  25. GNU C version 4.0.2 20051125 (Red Hat 4.0.2-8) (i386-redhat-linux)
  26.         compiled by GNU C version 4.0.2 20051125 (Red Hat 4.0.2-8).
  27. GGC 准则:--param ggc-min-expand=99 --param ggc-min-heapsize=129201
  28. as -V -Qy -o /tmp/ccpKSXRl.o /tmp/cckRAKQI.s
  29. GNU assembler version 2.15.94.0.2.2 (i386-redhat-linux) using BFD version 2.15.94.0.2.2 20041220
  30. /usr/libexec/gcc/i386-redhat-linux/4.0.2/collect2 --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 /usr/lib/gcc/i386-redhat-linux/4.0.2/../../../crt1.o /usr/lib/gcc/i386-redhat-linux/4.0.2/../../../crti.o /usr/lib/gcc/i386-redhat-linux/4.0.2/crtbegin.o -L/usr/lib/gcc/i386-redhat-linux/4.0.2 -L/usr/lib/gcc/i386-redhat-linux/4.0.2 -L/usr/lib/gcc/i386-redhat-linux/4.0.2/../../.. /tmp/ccpKSXRl.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/i386-redhat-linux/4.0.2/crtend.o /usr/lib/gcc/i386-redhat-linux/4.0.2/../../../crtn.o
  31. [matt@localhost tmp]$ ./a.out
  32. 2x2 is 4[matt@localhost tmp]$
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-6-19 18:36:22 | 显示全部楼层
math.h在哪个目录下,我用find命令找不到
编译程序时,老是出现找不到math.h
我用的是FC5,哪个rpm包里有math.h呢
回复 支持 反对

使用道具 举报

发表于 2006-6-20 12:37:19 | 显示全部楼层
我的机器以前做hello world的程序(只要不用到stdio.h以外的东东的话)的时候不用写头文件就可以编译通过,但是如果想使用math.h  然后程序里使用比如sqrt 函数 编译的时候就会出现楼主的情况,但后来那个机器更新以后(debian  apt-get update...upgrade)就好了,所有的头文件和函数都可以用~~
现在重新做了系统,升级了内核,又回到原来了~~~是不是C语言环境没配置好啊??
等待高手帮忙~~~
回复 支持 反对

使用道具 举报

发表于 2009-4-28 18:15:59 | 显示全部楼层
Post by MatthewGong;1388304
  1. [matt@localhost tmp]$ cat main.c
  2. #include <stdio.h>
  3. #include <math.h>
  4. int main()
  5. {
  6. int i;
  7. i = pow(2,2);
  8. printf("2x2 is %d", i);
  9. return 0;
  10. }
  11. [matt@localhost tmp]$ gcc -v main.c
  12. 使用内建 specs。
  13. 目标:i386-redhat-linux
  14. 配置为:../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,java,f95,ada --enable-java-awt=gtk --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --host=i386-redhat-linux
  15. 线程模型:posix
  16. gcc 版本 4.0.2 20051125 (Red Hat 4.0.2-8)
  17. /usr/libexec/gcc/i386-redhat-linux/4.0.2/cc1 -quiet -v main.c -quiet -dumpbase main.c -auxbase main -version -o /tmp/cckRAKQI.s
  18. 忽略不存在的目录“/usr/lib/gcc/i386-redhat-linux/4.0.2/../../../../i386-redhat-linux/include”
  19. #include "..." 搜索从这里开始:
  20. #include <...> 搜索从这里开始:
  21. /usr/local/include
  22. /usr/lib/gcc/i386-redhat-linux/4.0.2/include
  23. /usr/include
  24. 搜索列表结束。
  25. GNU C version 4.0.2 20051125 (Red Hat 4.0.2-8) (i386-redhat-linux)
  26.         compiled by GNU C version 4.0.2 20051125 (Red Hat 4.0.2-8).
  27. GGC 准则:--param ggc-min-expand=99 --param ggc-min-heapsize=129201
  28. as -V -Qy -o /tmp/ccpKSXRl.o /tmp/cckRAKQI.s
  29. GNU assembler version 2.15.94.0.2.2 (i386-redhat-linux) using BFD version 2.15.94.0.2.2 20041220
  30. /usr/libexec/gcc/i386-redhat-linux/4.0.2/collect2 --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 /usr/lib/gcc/i386-redhat-linux/4.0.2/../../../crt1.o /usr/lib/gcc/i386-redhat-linux/4.0.2/../../../crti.o /usr/lib/gcc/i386-redhat-linux/4.0.2/crtbegin.o -L/usr/lib/gcc/i386-redhat-linux/4.0.2 -L/usr/lib/gcc/i386-redhat-linux/4.0.2 -L/usr/lib/gcc/i386-redhat-linux/4.0.2/../../.. /tmp/ccpKSXRl.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/i386-redhat-linux/4.0.2/crtend.o /usr/lib/gcc/i386-redhat-linux/4.0.2/../../../crtn.o
  31. [matt@localhost tmp]$ ./a.out
  32. 2x2 is 4[matt@localhost tmp]$
复制代码
我在我的gcc 4.3上面测试,代码如下:
#include <stdio.h>                                                              
#include <math.h>                                                               
                                                                                
int main()                                                                     
{                                                                              
    double d;                                                                  
    d = sqrt(-1);                                                               
    d = sqrt(2);                                                               
    return 0;                                                                  
}      
前提是我已经更新了ldconfig的缓存,加入了路径。                                                                        
当我将-lm选项加上时,编译链接顺利通过,当我不加时显示ld错误,sqrt未定义,但是如果我把第一个-1改成正数,编译又通过。。。
回复 支持 反对

使用道具 举报

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

本版积分规则

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