库的创建
静态库:
库是一组预先编译好的函数的集合,这些函数都是按照可重用的原则编写的。它们通常由一组相互关联的函数组成来执行某项常见的任务,
标准库的位置一般存放在/lib和/user/lib目录中。
库的命名规则名字总是以lib开头以.a或者.so结尾,其中以.a结尾的代表传统的静态函数库,而以.so结尾的代表共享函数库库函数通常以静态库和共享库的形式存在,我们可以用ls /usr/lib命令查看,例子:gcc -o main main.c /usr/lib/libm.a这个命令的含义是让我们编译一个名叫main.c的文件,将编译好的文件以main命名,同时在编译时我们不但要访问标准c语言库,还要访问数学库来解决。也可以写成gcc -o main main.c -lm
静态库:将.c文件处理成.o文件
将.o文件添加到库里面ar c(创建)r(添加)v(显示过程).例如:ar crv libm.a add.o sum.o,
将add.o,sum.o添加到libfoo.a中
编译文件时,必须要在后面加上路径以-L开头 ,后面是需要的库以-l开头,值得注意的是l后面的库名是不要前缀(lib)和后缀(.a)的,否则会出错
将方法移动到标准目录底下,我们可以不加路径执行成功,系统会自动访问标准库
共享库
共享库的创建是以gcc来创建的,例如:gcc -shared -fpic -o libfoo.so add.o max.o。这里将add.o换成add.c也会运行成功,系统会帮我们处理,但是笔者在这里想说明方法是以.o的形式添加到共享库中的。
当我们准备编译时,出现了错误,系统提示我们没有找到这个库。是不是很困惑?明明在后面加了路径,这是因为我们没有将libfoo.so共享库移动到标准目录底下。此时我们可以通过一个叫lld的命令来查看我们编译main.c时所需要的库,此时我们看到libfoo.so => mot found,提示我们没有找到这个库,这时我们将共享库移动到标准库,就能运行成功了,因为系统已经在标准库中找到了libfoo.so共享库。编译好后我们再运行main时,不用再后面加路径了,因为main函数已经链接到了共享库的位置。
共享库和静态库的区别
静态库所需要的库删除以后代码还能运行,因为在代码中已经将静态库方法拷贝过来。
共享库不会包含,它只是运行时进行链接,如果删除的话,会运行失败