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

本文介绍了如何制作和使用静态库(.a)和动态库(.so)。静态库在编译时将代码链接到可执行文件,运行时不再需要库;动态库在运行时链接,节省磁盘和内存空间。制作静态库使用`ar`命令,动态库则需要`gcc`的`-shared`和`-fPIC`选项。动态库运行时可能需要将其复制到系统库路径或设置`LD_LIBRARY_PATH`。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

静态库(.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更新       

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值