您的位置:首页 > 运维架构 > Linux

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

2011-10-17 14:19 435 查看
库是预编译的目标文件(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,log及sqrt。链接器将搜索所有文件来找到包含 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选项来指定要链接的数学库,图形库,网络库等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐