您的位置:首页 > 其它

动态库和静态库

2018-03-27 17:59 120 查看
静态库:.a)程序在编译连接的时候把库的代码链接到可执行文件中,程序运行的时候讲不再需要静态库。

动态库:.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


总结:

静态链接方式的好处是:方便程序移植,因为可执行程序与库函数再无关系,放在如何环境当中都可以执行。

缺点是:文件太大

动态链接方式的好处是:多个程序可共用一个动态库,在程序运行过程中动态调用库文件,很方便,不占空间

缺点是:可移植性太差,如果两台电脑运行环境不同,动态库存放的位置不一样,很可能导致程序运行失败。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: