静态库和动态库的制作及使用

静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静 态库

动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。 一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文 件的整个机器码 在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个 过程称为动态链接(dynamic linking) 动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚 拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。

1.静态库的制作

创建一个文件夹lib,在lib里面制作静态库

add.c

#include"add.h"

int add(int x ,int y)
{
        return x + y;
}

add.h

extern int add(int x, int y );

mutil.c

int mutil(int x,int y)
{
        return x * y;
}

mutil.h

extern int mutil(int x ,int y);

makefile

libmymath.a:add.o mutil.o
        ar -rc $@ $^
add.o:add.c
        gcc -c $^ -o $@
mutil.o:mutil.c
        gcc -c $^ -o $@
.PHONY:clean
clean:
        rm -rf libmymath.a *.o

 # ar -tv libmymath.a

t:列出静态库中的文件

v:verbose 详细信息

 

 

在lib中执行make,生成静态库mymath,在上级目录下执行

 gcc test.c -o test -Llib -lmymath 生成可执行程序

-L 指定库路径 -l 指定库名 测试目标文件生成后,静态库删掉,程序照样可以运行。

2.动态库的制作

动态库的制作只需要修改makefile文件

libmymath.so:add.o mutil.o
        gcc -shared -o $@  $^
add.o:add.c
        gcc -fPIC -c $^ -o $@
mutil.o:mutil.c
        gcc -fPIC -c $^ -o $@
.PHONY:clean
clean:
        rm -rf libmymath.so *.o

shared: 表示生成共享库格式

fPIC:产生位置无关码(position independent code) 

gcc test.c -o test -Llib -lmymath 生成可执行程序

但是运行会报错

./test: error while loading shared libraries: libmymath.so: cannot open shared object file: No such file or directory

 解决办法

1:1、拷贝.so文件到系统共享库路径下, 一般指/usr/lib

2、更改 LD_LIBRARY_PATH 

export LD_LIBRARY_PATH =“库的路径”

3.ldconfig 配置/etc/ld.so.conf.d/,ldconfig更新       

添加一个新的文件,在文件写上库的路径就可以运行了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值