动态库和静态库

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

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

动态链接方式的好处是:多个程序可共用一个动态库,在程序运行过程中动态调用库文件,很方便,不占空间
缺点是:可移植性太差,如果两台电脑运行环境不同,动态库存放的位置不一样,很可能导致程序运行失败。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值