作业疑点:关于Linux下数学函数math.h无法编译问题
2013-08-03 20:49
603 查看
今天在做作业中碰到了一个gcc编译不了了c程序,查看报错提示的是math函数未定义,可是查看原程序未发现问题,在网上查看了资料后才知道问题所在和解决答案。资料如下:
# 链接外部库。库是预编译的目标文件(object files)的集合,它们可被链接进程序。静态库以后缀为‘.a’的特殊的存档文件(archive file)存储。标准系统库可在目录 /usr/lib 与 /lib 中找到。比如,在类 Unix 系统中 C 语言的数学库一般存储为文件 /usr/lib/libm.a。该库中函数的原型声明在头文件 /usr/include/math.h 中。C
标准库本身存储为 /usr/lib/libc.a,它包含 ANSI/ISO C 标准指定的函数,比如‘printf’。对每一个 C 程序来说,libc.a 都默认被链接。
下面的是一个调用数学库 libm.a 中 sqrt 函数的的例子:
hua@hua-linux:~$ cat -b math.c
1 #include <math.h>
2 #include <stdio.h>
3 int main (void)
4 {
5 double x = sqrt (4.0);
6 printf ("The value of sqrt(4.0) is %f\n", x);
7 return 0;
8 }
hua@hua-linux:~$ gcc -Wall math.c /usr/lib/libm.a -o math
hua@hua-linux:~$ ./math
The value of sqrt(4.0) is 2.000000
#如果不 加上/usr/lib/libm.a 会报错, 提示没有定义sqrt
因为函数 sqrt,未在本程序中定义也不在默认库‘libc.a’中;除非被指定,编译器也不会链接‘libm.a’。
为使编译器能将 sqrt 链接进主程序‘math.c’,我们需要提供数学库‘libm.a’。一个容易想到但比较麻烦的做法是在命令行中显式地指定它,即像上面那样。
函数库‘libm.a’包含所有数学函数的目标文件,比如sin,cos,exp,log及sqrt。链接器将搜索所有文件来找到包含sqrt的目标文件。
一旦包含 sqrt 的目标文件被找到,主程序就能被链接,一个完整的可执行文件就可生成了.
可执行文件包含主城许的机器码以及函数库‘libm.a’中sqrt 对应的机器码。
为避免在命令行中指定长长的路径,编译器为链接函数库提供了快捷的选项‘-l’。例如,下面的命令
代码:
$ gcc -Wall math.c -lm -o math /*与 gcc -Wall math.c -lm -o math是样的效果*/
一般来说,选项 -lNAME使链接器尝试链接系统库目录中的函数库文件 libNAME.a。一个大型的程序通常要使用很多 -l 选项来指定要链接的数学库,图形库,网络库等。
以上是在网上摘录的,我遇到的问题如下:
1 #include <stdio.h>
2 #include <math.h>
3
4 int main(int argc, char **argv)
5 {
6 double x = 0.0;
7 double s = 0.0;
8
9 printf("input number:\n");
10 scanf("%lf",&x);
11 s = sin(x);
12 printf("sine of %lf is %lf\n",x,s);
13
14 return 0;
15 }
localhost.localdomain:/home/lifcs/opt/> gcc p10.c -o p10
/tmp/ccuyi52M.o: In function `main':
p10.c:(.text+0x41): undefined reference to `sin'
collect2: ld 返回 1
localhost.localdomain:/home/lifcs/opt/> :q
-bash: :q: command not found
localhost.localdomain:/home/lifcs/opt/> gcc p10.c -lm -o p10
localhost.localdomain:/home/lifcs/opt/> ./p10
input number:
2
sine of 2.000000 is 0.909297
localhost.localdomain:/home/lifcs/opt/>
# 链接外部库。库是预编译的目标文件(object files)的集合,它们可被链接进程序。静态库以后缀为‘.a’的特殊的存档文件(archive file)存储。标准系统库可在目录 /usr/lib 与 /lib 中找到。比如,在类 Unix 系统中 C 语言的数学库一般存储为文件 /usr/lib/libm.a。该库中函数的原型声明在头文件 /usr/include/math.h 中。C
标准库本身存储为 /usr/lib/libc.a,它包含 ANSI/ISO C 标准指定的函数,比如‘printf’。对每一个 C 程序来说,libc.a 都默认被链接。
下面的是一个调用数学库 libm.a 中 sqrt 函数的的例子:
hua@hua-linux:~$ cat -b math.c
1 #include <math.h>
2 #include <stdio.h>
3 int main (void)
4 {
5 double x = sqrt (4.0);
6 printf ("The value of sqrt(4.0) is %f\n", x);
7 return 0;
8 }
hua@hua-linux:~$ gcc -Wall math.c /usr/lib/libm.a -o math
hua@hua-linux:~$ ./math
The value of sqrt(4.0) is 2.000000
#如果不 加上/usr/lib/libm.a 会报错, 提示没有定义sqrt
因为函数 sqrt,未在本程序中定义也不在默认库‘libc.a’中;除非被指定,编译器也不会链接‘libm.a’。
为使编译器能将 sqrt 链接进主程序‘math.c’,我们需要提供数学库‘libm.a’。一个容易想到但比较麻烦的做法是在命令行中显式地指定它,即像上面那样。
函数库‘libm.a’包含所有数学函数的目标文件,比如sin,cos,exp,log及sqrt。链接器将搜索所有文件来找到包含sqrt的目标文件。
一旦包含 sqrt 的目标文件被找到,主程序就能被链接,一个完整的可执行文件就可生成了.
可执行文件包含主城许的机器码以及函数库‘libm.a’中sqrt 对应的机器码。
为避免在命令行中指定长长的路径,编译器为链接函数库提供了快捷的选项‘-l’。例如,下面的命令
代码:
$ gcc -Wall math.c -lm -o math /*与 gcc -Wall math.c -lm -o math是样的效果*/
一般来说,选项 -lNAME使链接器尝试链接系统库目录中的函数库文件 libNAME.a。一个大型的程序通常要使用很多 -l 选项来指定要链接的数学库,图形库,网络库等。
以上是在网上摘录的,我遇到的问题如下:
1 #include <stdio.h>
2 #include <math.h>
3
4 int main(int argc, char **argv)
5 {
6 double x = 0.0;
7 double s = 0.0;
8
9 printf("input number:\n");
10 scanf("%lf",&x);
11 s = sin(x);
12 printf("sine of %lf is %lf\n",x,s);
13
14 return 0;
15 }
localhost.localdomain:/home/lifcs/opt/> gcc p10.c -o p10
/tmp/ccuyi52M.o: In function `main':
p10.c:(.text+0x41): undefined reference to `sin'
collect2: ld 返回 1
localhost.localdomain:/home/lifcs/opt/> :q
-bash: :q: command not found
localhost.localdomain:/home/lifcs/opt/> gcc p10.c -lm -o p10
localhost.localdomain:/home/lifcs/opt/> ./p10
input number:
2
sine of 2.000000 is 0.909297
localhost.localdomain:/home/lifcs/opt/>
相关文章推荐
- 关于linux 下用gcc 无法编译 bool 类型的问题解决
- 关于linux调用多个usb摄像头时无法工作的问题
- delphi 函数类型定义为 array of string 无法编译通过的问题
- 关于wince 使用占用空间大的内存变量问题(编译无错误但是无法运行的问题)
- 关于javascript在子页面中函数无法调试问题的解决
- 关于VMWare Workstation中安装的linux虚拟机设置桥接方式无法联网问题的解决
- Linux下gcc编译中关于头文件与库文件搜索路径相关问题(二)
- 关于linux动态库中无法设置线程栈大小的问题
- [原创]关于《精通QT4编程》第一个例子无法编译的问题的解答
- 关于eclipse无法自动编译的问题
- 关于javascript在子页面中函数无法调试问题的解决
- 还是关于linux 内核编译问题,再次转贴 配置并编译内核[更新到linux-2.6.34]
- 解决 linux 编译定制新内核后 virtualbox和vmware无法使用的问题
- 关于使用apktool可以反编译无法回编译的解决问题
- 关于嵌入式linux下的驱动程序编译问题
- [原创]关于《精通QT4编程》第一个例子无法编译的问题的解答
- 关于在新建的package中用SetContentView()函数时无法找到已创建的R.layout的布局文件的的问题的解决办法
- 关于“无法解析的外部符号”和“该符号在函数_wmain 中被引用”的问题
- 一个关于linux进程函数kill的问题
- 关于编译Linux-2.6.38.8内核时s3c_device_ohci未定义问题的分析