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

静态库(.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
    评论
静态库动态库是在软件开发常用的两种库文件形式。下面我会分别介绍一下它们的制作过程。 1. 静态库制作静态库是在链接时被完整地复制到可执行程序的库文件,它包含了函数和数据的实现。静态库制作分为以下几个步骤: - 编写源代码并编译成目标文件(.o或.obj文件):使用编译器将源代码编译成目标文件。例如,使用 GCC 编译器可以执行以下命令:`gcc -c mylib.c -o mylib.o`。 - 将目标文件打包成静态库文件:使用静态库打包工具(如ar)将目标文件打包成静态库文件。例如,使用 ar 工具可以执行以下命令:`ar rcs libmylib.a mylib.o`。这将生成名为 libmylib.a 的静态库文件。 - 将生成的静态库文件与头文件一起发布:将生成的静态库文件 libmylib.a 与相关的头文件一起提供给其他开发使用。 2. 动态库制作动态库是在运行时被动态加载的库文件,它可以在多个程序之间共享。动态库制作分为以下几个步骤: - 编写源代码并编译成目标文件(.o或.obj文件):同样,使用编译器将源代码编译成目标文件。例如,执行以下命令:`gcc -c -fPIC mylib.c -o mylib.o`。注意,这里加入了 `-fPIC` 参数,以生成位置无关的代码。 - 将目标文件打包成动态库文件:使用动态库打包工具(如gcc)将目标文件打包成动态库文件。例如,执行以下命令:`gcc -shared mylib.o -o libmylib.so`。这将生成名为 libmylib.so 的动态库文件。 - 将生成的动态库文件与头文件一起发布:将生成的动态库文件 libmylib.so 与相关的头文件一起提供给其他开发使用制作完成后,其他开发者可以使用静态库动态库来链接到他们的程序,以使用提供的函数和数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值