无论是在 windows 还是 linux 下都存在着库,库是二进制文件,里面有一些函数,它可以看成函数的集合,可以方便程序员调用,程序员只需要 include 它的头文件即可调用函数。
使用库的好处:
①可以减少开发者的代码开发量,缩短开发周期。
②提高代码的重用性。
库如何进行使用:
需要两个文件,一个是头文件,一个是库文件。
①头文件——包含了库函数的声明
②库文件——包含了库函数代码的具体实现细节
注:库并不能单独使用,只有通过其他程序调用才能执行。
那接下来我们来谈谈怎么创建动态库和静态库:
静态库的创建
静态库可以认为是一些函数的集合,它是在程序运行前就加载到程序里面了,成为程序执行的一部分。
静态库一般的格式为
:
lib + “
名字
” + .a
后缀为
.a
例如:libtest1.a
下面进行静态库的制作
第一步:将编写好的.c 文件的代码生成对应的.o 文件
gcc -c xx.c -o xx.o
//可链接文件,包含了这个.c 文件本身所有的二进制指令
第二步:将生成好的.o 文件通过 ar 打包工具打包成.a 文件
ar -rcs
lib 库的名字.a
o 文件列表
//
例如:
ar -rcs libxx.a a.o b.o c.o
其中
rcs
参数的意思如下:
①r
更新
②c
创建
③s
建立索引
步骤二结束后就会出现
libtest.a
这么一个库文件
静态库的优缺点
①
优点:
静态库是直接加载到应用程序里面的,所以方便程序进行寻找。程序在运行的时候和库函数没有任何关系了,因为库函数的已经加载到应用程序里面了,所以移植到其他地方就很方便,不用管库函数,所以删除库函数程序照样能运行。
②
缺点:
消耗系统资源比较大,每个使用静态库的都要复制一份,浪费内存。如下图所示。
每一个程序都需要加载一份静态库,如果有很多很多程序,那么每一个都需要加载一份静态库 的话就会很消耗资源。
还有一点就是更新不太方便,如果这个应用程序,比如一个游戏需要更新,那么我就需要重新下载一下,因为静态库的是直接加载到应用程序里面的,就需要重新编译。这样可能是一个很小的操作,都会导致重新下载或编译。
动态库的创建
在 linux 里动态库也可以叫作共享库。动态库和静态库不一样,它只有在程序运行时才被载入的。并且几个程序都调用它的话,只要在内存中有一份就行,避免了静态库的浪费资源的问题。同时它也避免了静态库更新的问题,用户只需要更新动态库即可。
动态库一般格式:
lib + “名字” + .so
例如:libtest.so
下面是动态库的创建过程:
生成目标.so 文件,要加编译选项-fpic(pic,position independent code),目的是为了能够在多个应用程序间共享。然后生成共享库,此时要加链接器选项:-shared
gcc
-shared -fpic
-o libxxx.so
xxx1.c xxx2.c …
动态库的优缺点
①优点:
方便更新,也不会占用太多资源
②缺点:
移植性差,因为你动态库不是加载到应用程序内部的,所以移植的时候得带上,并且加载是外部加载,所以会比较慢。
库的使用方法
在编辑好库之后,在引用库编译生成可执行文件时,要使用参数包含库文件名和库文件位置和头文件位置
1.用(-I 路径/文件)指定头文件位置(
-I 后面不需要空格,以下都是)
2.用(-l 动态库名)指定编译的库函数(如调用数学函数要加-lm)
3.用(-L 路径/文件)指定库文件存放位置
例如:
gcc main.c -o mian -I./hfile -la -L./sofile
但是注意在使用动态库之前,需要对环境变量进行修改,因为动态库并不是像静态库一样在编译阶段就被加载到程序中,所以要配置环境变量加载动态库,具体操作是:在 linux 中有一个环境变量 LD_LIBRARY_PATH,
表示加载库的路径
使用 export 环境变量=$环境变量:你要添加的路径(库文件存放位置)
就可以加载动态库文件 到程序,当然可以写入到/etc/profile 或家目录的.bashrc 或/etc/environment 中使其不局限于本次终端有效