GNU编译器学习 --> 如何链接外部库【Li…
2018-11-05 08:22:08来源:博客园 阅读 ()
库也就是我们常说的library,一个库是若干个已经编译过的目标文件(.obj)的集合,它可以被链接到程序里。那么我们最常见的使用就是,我们在编程时会调用一些函数,这些函数别人已经写好了,它就放在库里面。比如C的数学库里的sqrt开根号函数,这个函数在libm.a里。
库通常存放在专门的档文件里,以".a"为文件后缀,也即linux下的静态库。使用GNU的归档命令ar就可以从目标文件(.obj)构建档文件。链接工具linker会在编译时解决函数引用问题。本文将只介绍静态库。需要使用共享库的动态链接可期待我接下来的文章。
在linux下,一般的系统库都放在"/usr/lib"和"/lib"下。例如,在类Unix系统下,C的数学库一般存放在"/usr/lib/libm.a"。而相应的函数原型声明则在"/usr/include/math.h"给出。C的标准库则存在"/usr/lib/libc.a',这里面有ANSI/ISO C标准中指定的函数,比如"printf",这个库默认被所有C程序自动链接。
接下来给一个例程,在这个例程(calc.c)里,需要调用数学库(libm.a)中的一个函数sqrt。
#include <math.h> #include <stdio.h> int main (void) { double x = sqrt (2.0); printf ("The square root of 2.0 is %f\n", x); return 0; }
当我们尝试创建一个可执行文件时,compiler在链接阶段发出error。
$ gcc -Wall calc.c -o calc /tmp/ccbR6Ojm.o: In function `main': /tmp/ccbR6Ojm.o(.text+0x19): undefined reference to `sqrt'
这个问题产生的原因是链接时无法解析sqrt函数(这个calc.c里并没有对sqrt函数的定义,默认链接的库libc.a里也找不到相关解析。而真正定义声明了这个函数的外部库libm.a没有被链接到,所以不能从这个库里找)。顺便说一下,报错里提到的这个“/tmp/ccbR60jm.o”是一个用于链接进程的临时目标文件。那么应该如何解决这个问题呢?
我们需要想办法提供"libm.a"这个库给编译器。一个很容易想到但是十分笨拙的方法就是在编译命令里显式地提到这个库:
$ gcc -Wall calc.c /usr/lib/libm.a -o calc
"ilbm.a"这个库包含了所有数学公式的目标文件,例如sin,cos,exp,log以及sqrt。链接器linker会去搜索这个库去找包含sqrt这个函数的目标文件。
一旦找到了那个目标文件,刚才的代码就可以顺利地生成完整的可执行文件:
$ ./calc The square root of 2.0 is 1.414214
生成的这个可执行文件将会含括main函数的机器码和sqrt函数的机器码(从libm.a中拷贝相应的目标文件)。也就是运行的时候已经不需要libm.a了。
但是我们不会希望每次都要在编译的命令里放辣么长的path吧。因此gcc编译器提供了短的选项命令符"-l" 一遍链接时触及你想要的库。下面的命令可以替换之前的编译命令。
$ gcc - Wall calc.c -lm -o calc
使用编译器选项 -lNAME 可以让编译器尝试链接 "libNAME.a"(一般来说这个库必须处于标准库目录)里的目标文件。至于其他目录里的库文件如何链接(使用编译器选项指明环境变量)请期待后续文章。所以一般大型的项目将会用到很多-l 选项去链接各种能够各样的库:数学库、图形库还有网络库等等。
参考资源:
1 gcc入门
2 An Introduction to GCC - for the GNU compilers gcc and g++
3 Linux下的tar压缩解压缩命令详解
4 linux下的find文件查找命令与grep文件内容查找命令
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 如何0基础学习C/C++? 2020-06-06
- vtk学习记录(三)——初识vtkRenderer 2020-05-16
- C++基础 学习笔记六:复合类型之数组 2020-04-25
- C++基础 学习笔记五:重载之运算符重载 2020-04-23
- C++基础 学习笔记四:重载之函数重载 2020-04-22
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash