Linux下库的概念
静态库和共享库
静态库是指在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中的这种库。
注:静态库是在链接的时候复制到可执行文件中,则说明静态库是在文件执行前以嵌入的方式放置到可执行文件里面构成可执行文件的一部分。这样的好处是提高了程序的执行效率(速度),但是缺点也很明显,因为是嵌入到可执行文件中所以会增加文件存储过程中磁盘的占用以及运行过程中内存的占用率。
而动态库则和静态库不一样,动态库并不会在连接的时候作为一个拷贝嵌入到可执行文件中,而是在程序的执行前动态的调用。
注:和静态库一比较两者的区别也就很明显了。共享库不用在连接的时候嵌入可执行文件中提高了程序的灵活性,如果需要更新也不用重新编译代码只需要替换库就可以。当然相比之下缺点也就很明显了,在执行效率上没有静态库那么高。
静态库和共享库都是共享程序代码的方式。在linux中静态库以.a作为扩展名而windows系统下则以.lib作为扩展名;而在linux中共享库则以.so作为扩展名,在windows中则以.dll做为扩展名。
库的编写
静态库
静态库是obj文件的一个集合,使用ar生成。
Test文件夹下三个文件main.c、test.c、test.h |
main.c 1 #include<stdio.h> 2 #include"test.h" 3 int main() 4 { 5 printf("The add=%d\n",add(12,34)); 6 return 0; 7 } |
test.h 1 int add(int ,int); |
test.c 1 int add(int a,int b) 2 { 3 int sum=a+b; 4 return sum; 5 } |
1 生成目标文件test.o root@zhangyu-QiTianM4500-N000:test7# gcc -o test.o -c test.c 2 生成静态库 test.a root@zhangyu-QiTianM4500-N000:test7# ar -rcs test.a test.o 使用静态库 root@zhangyu-QiTianM4500-N000:test7# gcc -o main main.c test.a 执行结果: root@zhangyu-QiTianM4500-N000:test7# ./main |
拓展:
ar命令的使用:点击打开链接 |
ar命令选项 d -----从指定的静态库文件中删除文件 m -----把文件移动到指定的静态库文件中 p -----把静态库文件中指定的文件输出到标准输出 q -----快速地把文件追加到静态库文件中 r -----把文件插入到静态库文件中 t -----显示静态库文件中文件的列表 x -----从静态库文件中提取文件 还有多个修饰符修改以上基本选项,详细请man ar以下列出三个: a -----把新的目标文件(*.o)添加到静态库文件中现有文件之后 b-----***************************************之前 v -----使用详细模式 |
共享库和动态链接
其实共享库和动态链接库在格式上是一致的。但是共享库和动态链接库在实现上有一定的区别。共享库在程序的执行前(启动时)动态加载,而动态链接库则允许在程序执行过程中加载。针对这一部分网上有很多相关资料,因为目前针对这一块的分析不多,所以这部分不再进一步叙述。动态链接库有相关的操作函数这一点是需要注意的。