1.库的基本介绍
无论是在windows还是linux下都存在着库,库是二进制文件,里面有一些函数,它可以看成函数的集合,可以方便程序员调用,程序员只需要include它的头文件即可调用函数。
使用库的好处:
①可以减少开发者的代码开发量,缩短开发周期。
②提高代码的重用性。
库如何进行使用:
在前面说到了方便程序员调用,那么如何使用呢,就需要两个文件,一个是头文件,一个是库文件。
①头文件——包含了库函数的声明。
②库文件——包含了库函数代码的具体实现细节。
注:库并不能单独使用,只有通过其他程序调用才能执行。
在linux下可以分为动态库和静态库,下面对这两个库展开进行说明。
2.静态库
静态库可以认为是一些函数的集合,它是在程序运行前就加载到程序里面了,成为程序执行的一部分。
静态库一般的格式为:lib + “名字” + .a 后缀为.a
例如:libtest1.a
下面进行静态库的制作:
步骤一:
将编写好的.c文件的代码生成对应的.o文件。
gcc -o file1.c file2.c
步骤二:
将生成好的.o文件通过ar打包工具打包成.a文件。
ar rcs libtest.a file1.o file2.o
其中rcs参数的意思如下:
①r更新
②c创建
③s建立索引
步骤二结束后就会出现libtest.a这么一个 库文件,那么我们需要用以下命令去使用它。
之前说过,库不能单独使用,要配合头文件和其他程序使用,这里我用main.c来包含头文件,并且调用库里面的函数,main.c和其余的代码会在下面给出。
gcc -o main1 main.c -I./ -L./ -ltest
对上面的几个参数做一下解释:
①-I:是include也就是main.c指定头文件的目录,这里./就是说明当前位置。
②-L:指定要连接的库所在的目录。
③-l:这里l后面跟的名字一定要去掉lib和.a,这就是库文件名称。
静态库的优缺点:
①优点:
静态库是直接加载到应用程序里面的,所以方便程序进行寻找。
程序在运行的时候和库函数没有任何关系了,因为库函数的已经加载到应用程序里面了,所以移植到其他地方就很方便,不用管库函数。
②缺点:
消耗系统资源比较大,每个使用静态库的都要复制一份,浪费内存。下面从别的地方偷一张图来说明这点。
还有一点就是更新不太方便,如果这个应用程序,比如一个游戏需要更新,那么我就需要重新下载一下,因为静态库的是直接加载到应用程序里面的,就需要重新编译。这样可能是一个很小的操作,都会导致重新下载或编译。
3.动态库
在linux里动态库也可以叫作共享库。动态库和静态库不一样,它只有在程序运行时才被载入的。并且几个程序都调用它的话,只要在内存中有一份就行,避免了静态库的浪费资源的问题。同时它也避免了静态库更新的问题,用户只需要更新动态库即可。
动态库一般格式:lib + “名字” + .so
例如:libtest.so
下面通过一张图来了解下动态库(图来自网络)
动态库的制作其实和静态库差不多,但是还是有点区别:
步骤一:
生成目标.o文件,这时候要加编译选项-fpic(pic,position independent code),目的是为了能够在多个应用程序间共享。
gcc -fpic file1.c file2.c
步骤二:
生成共享库,此时要加链接器选项:-shared
gcc -shared file1.o file2.o -o libtest.so
共享库的使用:
使用方法与静态库一样。
gcc -o main main.c -I./ -L./ -ltest
这里可能会出现一个错误,就是说找不到你的libtest.so文件。
因为你的库的寻找的地方没有进行配置,这时你可以把你的libtest.so文件放到/usr/lib下,不过这里一般是放系统文件的,不太可取,那么就用另一个方法。
在~目录下用:
vi .bashrc
然后在最后面加上
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:你指定的目录
你指定的目录例如:~/lib 这样
动态库的优缺点:
①优点:
其实优点就是静态库的缺点,它方便更新,也不会占用太多资源。
②缺点:
缺点恰好是静态库的优点,他移植性差,因为你动态库不是加载到应用程序内部的,所以移植的时候得带上,并且加载是外部加载,所以会比较慢。
4.文中提到的几个文件代码
//main.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include "head.h"//fun1和fun2的函数声明的头文件
4
5 int main(int argc,char *argv[])
6 {
7 printf("this is main!\n");
8
9 file1();
10 file2();
11
12 return 0;
13 }
//file1.c
1 #include <stdio.h>
2 void file1()
3 {
4 printf("this is file1\n");
5 }
//file2.c
1 #include <stdio.h>
2 void file2()
3 {
4 printf("this is file2\n");
5 }
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理