Linux系统中库文件的制作及使用

一、库文件的定义

:本质是一个二进制文件,在这个二进制文件中不能有main函数。
库文件客户保护用户代码的实现,然而也不影响其他用户的使用。库分为动态库静态库
通俗来讲就是将用户写好的程序打包成一个整体,当其他模块或用户使用时,只需要有这个库文件就可以了,不需要源代码文件。

常见的库的格式如下:
windows:
​动态库:xxxx.dll
​静态库:xxxx.lib

linux:
动态库:libxxx.so (xxx:库名)
静态库:libxxx.a (xxx:库名)

二、静态库

2.1 静态库的特点

静态库:静态库的格式是libxxx.a格式的,它是一个二进制文件。
如果用户想使用这个库文件需要将这个库文件和自己的.c文件编译生成一个可执行文件(将库中的函数放在可执行程序中)。

使用静态库生成的可执行文件体积比较大,运行的时候不在需要这个库文件libxxx.a,效率比较高。但使用静态库生成的可执行程序更新库比较麻烦。

2.2 静态库的制作

add.h

#ifndef __ADD_H__
#define __ADD_H__

int add(int a,int b);

#endif

add.c

int add(int a,int b)
{
    return (a+b);
}

main.c

#include <stdio.h>
#include <add.h>

int main(int argc, const char *argv[])
{
    int a = 100, b = 200;
    printf("%d\n", add(a, b));

    return 0;
}

在这里插入图片描述
执行命令gcc -c add.c -o add.o 只编译不链接生成add.o文件
在这里插入图片描述
执行命令ar -cr libadd.a add.o 生成libadd.a文件
ar 制作静态库的命令
-c 创建静态库
-r 将函数放到库文件中
在这里插入图片描述

2.3 静态库的使用

-L:指定库的路径
-l:链接使用的库
-I:指定头文件的路径

执行命令gcc main.c -L 库的路径 -l库名 -I 头文件路径生成a.out文件
在这里插入图片描述

三、动态库

3.1 动态库的特点

动态库:动态库的格式是libxxx.so格式的,它是一个二进制文件。
如果用户想使用这个库文件需要将这个库文件和自己的.c文件编译生成一个可执行文件(将库中的函数符号表放在可执行程序中)。

使用动态库生成的可执行文件体积比较小,可以被多个程序共享,所以又叫共享库。运行的时候需要这个库文件libxxx.so,效率比较低。但使用动态库生成的可执行程序更新简单。

3.2 动态库的制作

继续使用上面的程序为例:
在这里插入图片描述
执行命令:
gcc -fPIC -shared add.c -o ../lib/libadd.so制作动态库的命令
-fPIC:忽略文件位置
-shared:标识生成动态库
在这里插入图片描述

3.3 动态库的使用

3.3.1 编译可执行程序依赖动态库

-L:指定库的路径
-l:链接使用的库
-I:指定头文件的路径
执行命令:gcc main.c -L ../lib -ladd -I ../inc生成a.out文件
在这里插入图片描述

3.3.2 执行可执行程序(指定库的路径)

方式1:将自己的库放在/lib

sudo mv libadd.so /lib
./a.out

方式2:通过命令指定库的路径 (只在当前终端生效)

export LD_LIBRARY_PATH=../lib/
./a.out

方式3:通过修改库的配置文件让其生效

​sudo vi /etc/ld.so.conf.d/libc.conf

在这里插入图片描述
ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令。
在这里插入图片描述

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜猫徐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值