Chinaunix首页 | 论坛 | 博客
  • 博客访问: 95019
  • 博文数量: 57
  • 博客积分: 1570
  • 博客等级: 上尉
  • 技术积分: 530
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-15 19:23
文章分类

全部博文(57)

文章存档

2012年(6)

2009年(49)

2008年(2)

我的朋友

分类:

2009-07-22 10:45:00

(如 time.h math.h等)

前段时间在linux下 用gcc 编译一些简单的c 程序的时候,gcc -Wall NAME.c  -o NAME   ( 因为程序里有些c的一些库文件)老是提示我没定义它。在网络上找勒好久的答案都未解。今天终于搞定勒```    如下:
       # 链接外部库。库是预编译的目标文件(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 函数的的例子:
cat -b math.c
     1    #include
     2    #include

     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     }
gcc -Wall math.c /usr/lib/libm.a -o math
./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 选项来指定要链接的数学库,图形库,网络库等。
阅读(1121) | 评论(0) | 转发(0) |
0

上一篇:GCC精彩之旅(转自hwz119)

下一篇:博悟

给主人留下些什么吧!~~