如何在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选项来指定要链接的数学库,图形库,网络库等。
标准系统库可在目录 /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选项来指定要链接的数学库,图形库,网络库等。
相关文章推荐
- 如何添加一个 mingw gcc 编译的可…
- gcc下链接外部库(如 time.h math.h等)
- 如何给wordpress外部链接自动添加nofollow
- linux 链接库文件出现“undefined reference to" 问题的解决方法
- 如何解决Linux下Qt Creator调试C/C++程序出现Debugging starts &"warning: GDB: Failed to set controlling terminal警告
- extern "C"(外部链接C)
- arm-none-linux-gnueabi-gcc: VERSION": No such file or directory
- Linux下GCC 编译时为什么要指定链接库?如何指定链接库 ?
- 如何使 FlashGet "正常合法" 下载 Session 中的自定义文件链接呢? JSP/Servlet 实现!
- 如何解决在快速向jtable添加数据的时候报AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException:异常
- Linux中编辑器自动添加的换行符"\n"
- 嵌入式 Linux下GCC编译时如何指定链接库
- gcc链接.cpp和.c文件生成的.o库文件的时候,Linking error "undefined reference to `__gxx_personality_v0'"
- 如何将arm-linux-gcc编译的动态链接helloworld在Android上运行
- 如何使 FlashGet "正常合法" 下载 Session 中的自定义文件链接呢? JSP/Servlet 实现!
- Linux下GCC 编译时如何指定链接库
- linux 链接库文件出现“undefined reference to" 问题的解决方法
- Bigcommerce产品分类:给重复的CategoryName链接添加rel="nofllow"标记
- Linux操作系统的简单指令及如何使用vim编写一个程序,然后使用gcc查看【预处理】、【编译】、【汇编】、【链接】各阶段文件的内容。
- arm-linux-gcc( arm-none-linux-gnueabi-gcc) cause "No such file or directory"