如何在linux的gcc中添加c语言的外部链接库(“比如说,math.h"

库是预编译的目标文件(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函数的的例子,创建文件ctest3.c

#include<stdio.h>
#include<math.h>
main()
{
  long int i,x,y;
  for(i=1;i<100000;i++)
    {
     x=sqrt(i+100);
     y=sqrt(i+268);
     if(x*x==i+100&&y*y==i+268)
      printf("\n%ld\n",i);
     }
}

尝试单独从该文件生成一个可执行文件将导致一个链接阶段的错误:

root@mail:~/han# gcc -o ctest3 ctest3.c
/tmp/ccGWSm28.o: In function `main':
ctest3.c:(.text+0x3c): undefined reference to `sqrt'
ctest3.c:(.text+0x75): undefined reference to `sqrt'
collect2: ld returned 1 exit status

函数 sqrt,未在本程序中定义也不在默认库‘libc.a’中;除非被指定,编译器也不会链接‘libm.a’。

为使编译器能将sqrt链接进主程序‘ctest3.c’,我们需要提供数学库‘libm.a’。函数库‘libm.a’包含所有数学函数的目标文件,比如sin,cos,exp,logsqrt。链接器将搜索所有文件来找到包含 sqrt的目标文件。它的具体位置在/usr/lib文件目录下。

编译器为链接函数库提供了快捷的选项‘-l’。例如,下面的命令

gcc  -lm -o ctest3 ctest3.c 

与我们上面指定库全路径‘/usr/lib/libm.a’的命令等价。

输出结果为:

root@mail:~/han# ./ctest3


21


261


1581

一般来说,选项 -lNAME使链接器尝试链接系统库目录中的函数库文件 libNAME.a。一个大型的程序通常要使用很多 -l选项来指定要链接的数学库,图形库,网络库等。

阅读更多
个人分类: gcc编译工具
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭