动态库和静态库
2018-03-27 17:59
120 查看
静态库:(.a)程序在编译连接的时候把库的代码链接到可执行文件中,程序运行的时候讲不再需要静态库。
动态库:(.so)程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。
一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件整个机器码。
在可执行文件开始运行以前,操作系统将外部函数的机器码从磁盘上的该动态库中复制到内存中,这个过程称为动态链接。
动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间,操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。
静态库示例:
在终端运行命令步骤如下:
动态库示例:
示例代码同上
在终端运行命令如下:
总结:
静态链接方式的好处是:方便程序移植,因为可执行程序与库函数再无关系,放在如何环境当中都可以执行。
缺点是:文件太大。
动态链接方式的好处是:多个程序可共用一个动态库,在程序运行过程中动态调用库文件,很方便,不占空间。
缺点是:可移植性太差,如果两台电脑运行环境不同,动态库存放的位置不一样,很可能导致程序运行失败。
动态库:(.so)程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。
一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件整个机器码。
在可执行文件开始运行以前,操作系统将外部函数的机器码从磁盘上的该动态库中复制到内存中,这个过程称为动态链接。
动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间,操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。
静态库示例:
add.h文件 ------------------------------ #pragma once int add(int a,int b); add.c文件 ------------------------------ #include"add.h" int add(int a,int b) { return a+b; } sub.h文件 ------------------------------ #pragma once int sub(int a,int b); sub.c文件 ------------------------------ #include"sub.c" int sub(int a,int b) { return a-b; } main.c文件 ------------------------------ #include<stdio.h> #include"add.h" #include"sub.h" int main() { int a = 30; int b = 10; printf("%d + %d = %d\n",a,b,a+b); printf("%d - %d = %d\n",a,b,a-b); return 0; }
在终端运行命令步骤如下:
生成两个.o文件 gcc -c add.c -o add.o gcc -c sub.c -o sub.o
接着生成静态库 ar -rc libmymath.a add.o sub.o ar是gnu归档工具,rc表示(replace and create) 库名规则:libxxx.a
查看静态库中的目录列表 ar -tv libmymath.a t:列出静态库中的文件 v:verbose详细信息
编译main.c文件,使之链接我们自己生成的静态库,生成a.out可执行文件 gcc main.c -L. -lmymath -L:指定库的路径 -l:指定库名(去掉前缀和后缀,如去掉lib和.a以后就为mymath)
动态库示例:
示例代码同上
在终端运行命令如下:
gcc -fPIC -c sub.c add.c gcc -shared -o libmymath.so *.o shared:表示生成共享库格式 fPIC:产生位置无关码 库名规则:libxxx.so
运行动态库 第一步:拷贝.so文件到系统共享库路径下,一般指/usr/lib cp libmymath.so /usr/lib 第二步:更改LD_LIBRARY_PATH export LD_LIBRARY_PATH 然后编译main.c生成a.out可执行文件 gcc main.c -lmymath
第三步:ldconfig配置、etc/ld.so.conf.d/,ldconfig更新 ldconfig
总结:
静态链接方式的好处是:方便程序移植,因为可执行程序与库函数再无关系,放在如何环境当中都可以执行。
缺点是:文件太大。
动态链接方式的好处是:多个程序可共用一个动态库,在程序运行过程中动态调用库文件,很方便,不占空间。
缺点是:可移植性太差,如果两台电脑运行环境不同,动态库存放的位置不一样,很可能导致程序运行失败。
相关文章推荐
- Linux静态库和动态库
- 动态库和静态库
- Linux平台静态库、动态库的一些笔记
- linux中编译静态库(.a)和动态库(.so)的基本方法
- Windows下动态库和静态库的浅要对比分析
- Linux系统中静态库和动态库的生成和使用
- 在Linux中创建静态库和动态库
- android开发 NDK 编译和使用静态库、动态库
- 关于Linux静态库和动态库的分析
- linux 动态库和静态库
- ndk编译生成静态库和动态库
- linux windows 动态库 静态库
- 静态库和动态库的定位搜索
- 【C/C++】动态库与静态库
- 问题集合 ---- linux 静态库和动态库创建、检查、使用建议
- 动态库与静态库的使用,摘自http://www.blogjava.net/davidgw/archive/2009/01/21/252230.html
- Android初学习 – 带有动态库、静态库、Jar包的makefile编写
- linux 下创建静态库和动态库
- 静态库 动态库 编译
- Linux 静态库和动态库的区别