Linux库之动态库静态库

目录

一、什么是库

二、库的分类

1. 静态库

2. 动态库

三、库源文件

四、静态库的生成和制作

(1)命名规则

(2)制作步骤

(3)库的使用

五、动态库的生成和制作

(1)命名规则

(2)制作步骤

(3)动态库的使用


一、什么是库

        库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。就是将源代码转化为二进制格式的源代码,相当于进行了加密,别人可以使用库,但是看不到库中的内容。

二、库的分类

linux库引入之动态库静态库(生成和使用)_FHNCSDN的博客

win32平台下,静态库通常后缀为.lib,动态库为.dll ;
linux平台下,静态库通常后缀为.a,动态库为.so 。

静态库的名字一般为libxxxx.a,其中xxxx是该lib的名称;
动态库的名字一般为libxxxx.so.x.y.z,含义如图所示:

1. 静态库

        所谓静态库,就是在静态编译时由编译器到指定目录寻找并且进行链接,一旦链接完成,最终的可执行程序中就包含了该库文件中的所有有用信息,包括代码段、数据段等。

        静态链接库在程序编译时会被链接到目标代码中,目标程序运行时将不再需要改动态库,加载速度快移植方便体积较大浪费控件和资源,因为所有相关的对象文件与牵涉到库都被链接合成一个可执行文件,这样导致可执行文件的体积较大。

2. 动态库

        所谓动态库,就是在应用程序运行时,由操作系统根据应用程序的请求,动态到指定目录下寻找并装载入内存中,同时需要进行地址重定向。

        动态库在程序编译时并不会被链接到目标代码中,而是在程序运行时才被载入,因为可执行文件体积较小。有了动态库,程序的升级会相对比较简单,比如某个动态库升级了,只需要更换这个动态库的文件,而不需要去更换可执行文件。但要注意的是,可执行程序在运行时需要能找到动态库文件。

三、库源文件

add.c

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

add.h

int add(int x,int y);
int sub(int x,int y);

四、静态库的生成和制作

(1)命名规则

静态库文件名的命名方式是“ libxxx.a ”,库名前加“ lib ”,后缀用” .a ”,“ xxx ”为静态库名。

(2)制作步骤

1、将 add.c 编译成 .o 文件

gcc add.c -c

2、使用 ar 命令生成静态库libadd.a

ar rcs 静态库的名字 原材料
ar rcs libadd1.a add.o

(3)库的使用

        若直接 -l 编译会报错,因为 -l 会优先从 /urs/lib 或 /urs/local/lib 中去找,但我们想让它优先从当前路径去找,就要用到 -L 。

gcc mainfunc.c -ladd1 -L ./ -o mainfunc
//-l  是指定要用的动态库名称,库名砍头去尾去掉lib和.a
//-L 告诉gcc编译器从-L指定的路径去找静态库。默认先是从/urs/lib 或 /urs/local/lib 中去找,若-L后先从指定的路径去找,找不到再从/urs/lib 或 /urs/local/lib 中去找。
// ./表示当前路径
// -o后是编译后程序的名字

./mainfunc

五、动态库的生成和制作

(1)命名规则

动态库的命名方式与静态库类似,前缀相同,为“lib”,后缀变为“.so”。所以为“libmytime.so”

(2)制作步骤

gcc -shared -fpic add.c -o libadd2.so
//-shared : 指定生成动态库

(3)动态库的使用

gcc mainfunc.c -ladd2 -L ./ -o mainfunc

动态库优先从当前路径去找,没找到的话再去 /usr/lib/ 下去找通常动态库拷贝到 /usr/lib/ 下即可:

sudo cp libadd.so /usr/lib/

./mainfunc

动态库无法加载(引用动态库,怎么指定动态库的位置):

临时设置:在终端进行:export LD_LIBRARY_PATH=“动态库的路径”

利用脚本

vi start.sh
//创建一个.sh文件
export LD_LIBRARY_PATH="/home/pi/test//动态库的路径"
./mianPrody//所要执行的程序名称
//在文件夹中输入以上内容
chmod +x start.sh
//给脚本加可执行的的权限
./start.sh
//执行该脚本

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值