网易首页 > 网易号 > 正文 申请入驻

简述Linux下的静态库和动态库

0
分享至

库是一种软件组件技术,库里面封装了数据和函数。库的使用可以使程序模块化。库有两种:静态库和动态库。Windows系统包括静态链接库(.LIB文件)和动态链接库(.dll文件)。linux通常把库文件存放在/usr/lib或/lib目录下。Linux库文件名由:前缀lib、库名和后缀3部分组成,其中动态链接库以.so作为后缀,静态链接库通常以.a作为后缀。

1.何静态库和动态库?

静态库(static library, Statically-linked library, LIB)或称静态链接库,是一个外部函数与变量的集合体。静态库的文件内容,通常包含一堆程序员自定的变量与函数,在编译期间由编译器与连接器将它集成至应用程序内,并制作成目标文件以及可以独立运作的可执行文件。而这个可执行文件与编译可执行文件的程序,都是一种程序的静态创建(static build)。其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。即静态库中的指令全部被直接包含在最终生成的可执行文件中。

动态库(Dynamic library, Dynamic-link library, DLL)或称动态链接库,是微软公司在微软视窗操作系统中实现共享函数库概念的一种实现方式。动态链接库可被多个程序同时使用。所谓动态链接,就是把一些经常会共用的代码(静态链接的OBJ程序库)制作成DLL档,当程序有需求时函数才进行链接。透过动态链接方式,存储器浪费的情形将可大幅降低。静态链接库则是直接链接到可执行文件。

一个程序编译成可执行的步骤:

静态库和动态库的区别在链接阶段如何处理库,如果将库链接到目标代码中则是静态库,而将库链接载入推迟到程序运行的时期则是动态库,可以实现进程之间的资源共享。

2 Linux创建和使用静态库

前面已经介绍了静态库的概念,下面我们通过一个实例来看静态库的使用。

2.1生成静态库

1)这里准备了两个库的源码st1 、st2用它们来制作库libmytest.a,如下

$ ls -l
$ cat st1.c
#includevoid print1()printf("Hello!I am st1!\n ");
$ cat st2.c
#includevoid print2()printf("Hello!I am st2!\n");
$ cat main.c
#includeint main(int argc, const char *argv[])print1();print2();return 0;

2) 生成libmytest.a文件

创建静态库用ar命令,它将很多.o转换成.a

$ gcc -c st1.c st2.c
$ ar crs libmytest.a st1.o st2.o
$ ls -l
$ file libmytest.a

静态库文件libmytest.a已经生成,用file命令查看其属性,发现它确实是归档压缩文件。用ar -t libmytest.a可以查看一个静态库包含了那些obj文件:

$ ar -t libmytest.a

2.2使用静态库

直接使用

$gcc -o test main.c libmytest.a

双L链接法

$gcc -o test main.c -lmytest -L.(库所在目录,.表示当前目录)

单L链接法(需要配置环境变量LIBRARY_PATH,把库放在所在目录配置)

$gcc -o test main.c -lmytest

前面我们已经写好了main.c,现在测试一下

$ gcc -o test main.c -L. -lmytest
$ ls -l

$ ./test

这里gcc的参数-L是告诉编译器库文件的路径是当前目录,-l是告诉编译器要使用的库的名字叫mytest。

2.3静态库总结

在一个头文件中声明静态库所导出的函数。
在一个源文件中实现静态库所导出的函数。
编译源文件,生成可执行代码。
将可执行代码所在的目标文件加入到某个静态库中,并将静态库拷贝到系统默认的存放库文件的目录下。
下面通过一个例子来说明:
源文件:mylib.c

#includevoid welcome(void)printf("welcome to libmylib\n");

1>编译mylib.c生成目标文件:

$gcc -o mylib.o -c mylib.c

2>将目标文件加入到静态库中:

$ar -rcs libmylib.a mylib.o

【注】库文件名以lib开头,以.a结尾

3>将静态库copy到Linux的库目录(/usr/lib或者/lib)下:(也可以不拷贝,注意配置环境变量)

$sudo cp libmylib.a /usr/lib/libmylib.a //管理员身份

编写调用库函数的测试程序test.c:

#includeint main(void)printf("create and use library:\n");welcome();return 0;

4>使用静态库编译:

$gcc -o test test.c -lmylib

这里注意,编译时无需带上前缀和后缀。

5>运行可执行程序test:

$./test

在Linux下,可以使用ar命令来创建和修改静态库。
这些在linux下man ar一下就可以得到参数,这里说明几个常用的

d:从库中删除成员文件。
r:在库中加入成员文件,若存在,则替换。
c:创建一个库。
s:无论ar命令是否修改了库内容,都强制重新生成库符号表。

其他的命令用时再man。
【注】gcc -static 文件.c [-o 文件]//全部使用静态库的方法

3 Linux创建和使用动态库

动态库的基本概念

动态库的基本概念

1.动态链接库是程序运行时加载的库,当动态链接库正确安装后,所有的程序都可以使用动态库来运行程序。动态链接库是目标文件的集合,目标文件在动态链接库中的组织方式是按照特殊方式形成的。库中函数和变量的地址是相对地址,不是绝对地址,其真实地址在调用动态库的程序加载时形成。

2.动态链接库的名称有别名(soname), 真名(realname)和链接名(linker name)。别名由一个前缀lib,然后是库的名字,再加上一个后缀“.so”构成("libxxx.so")。真名是动态链接库真实名称,一般总是在别名的基础加上一个小版本号,发布版本等构成。除此之外,还有一个链接名,即程序链接时使用的库的名字。

3.在动态链接库安装的时候,总是复制文件到某个目录下,然后用一个软连接生成别名,在库文件进行更新的时候,仅仅更新软链接即可。

下面我们通过一个实例来学习如何生成动态库和使用动态库。

3.1生成动态库

1)当前文件夹下有下面四个文件

$ ls -l

文件内容分别为:

$ cat mylib.h
#ifndef _MYLIB_H_#define _MYLIB_H_#includevoid print1();void print2();#endif
$ cat dy1.c
#include "mylib.h"void print1()printf("My first shared lib!\n");
$ cat dy2.c
#include "mylib.h"void print2()printf("My second shared lib!\n");
$ cat main.c
#include "mylib.h"int main(int argc, char *argv[])print1();print2();return 0;

2)这里我们将dy1.c与dy2.c用来创建动态库

$ gcc -fPIC -Wall -c dy1.c dy2.c
$ gcc -shared -o libtest.so dy1.o dy2.o

这里 -fPIC 创建与地址无关的编译程序,-shared指定生成动态链接库。
我们也可以一步到位

$ gcc -o libtest.so -fPIC -shared dy1.c dy2.c

我们可以看到下面已经生成了一个libtest.so

$ ls -l

3.2使用动态链接库

在编译程序时,使用动态链接库和静态库是一致的,使用”-l库名”的方式,在生成可执行文件的时候会链接库文件。使用如下命令:

$ gcc -o test main.c -L. -ltest
$ ls -l

这里 -L 指定动态链接库的路劲,-ldtest链接库函数test 。-ltest是动态库的调用规则。Linux系统下的动态库命名方式是lib*.so,而在链接时表示位-l*,*是自己命名的库名。
我们可以看到这里已经生成了test可执行文件,我们可以执行一下:

$ ./test

可以发现发生了错误,这是因为程序运行时没有找到动态链接库造成的。程序编译时链接动态库和运行时使用动态链接库的概念是不同的,在运行时,程序链接的动态链接库需要在系统目录下才行。
这就到了动态库的路径问题,有三种方法:

1)把库拷贝到/usr/lib和/lib目录下:

$ sudo cp libtest.so /lib

【注】这里要超级用户权限sudo
我们看一下执行结果:

$ ./test

这里执行结果正确。

2)在 LD_LIBRARY_PATH 环境变量中加上库所在路径

$ export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH

我们可以看到:libtest.so 的路径已经存在

$ ldd test

我们可以看一下结果:

$ ./test

也能得到正确结果。

3)添加/etc/ld.so.conf.d/*.conf文件。把库所在的路径加到文件末尾,并执行ldconfig刷新。

$ cd /etc/ld.so.conf.d/
$ ls
$ sudo vi my.conf
$ cat my.conf
/home/bruceou/demo/libtest.so

在/etc/ld.so.conf.d/下建立my.conf 里面只有一句/home/bruceou/demo/libtest.so即libtest.so的路径,然后执行ldconfig刷新即可。

3.3动态库总结

1.编译动态库
方法一:
命令:

gcc -fPIC -Wall -c .c

命令:

gcc -shared -o lib.so .o

方法二:
命令:

gcc .c .c .c -fPIC -shared -o lib.so

2.安装路径
命令:

cp lib.so /usr/lib/lib.so//管理员身份

3.动态库的链接
命令:

gcc -o .c -L. -l

或者:

命令:gcc .c -L. -l -o

4.运行可执行程序

  • 原文来自:https://www.163.com/dy/article/HR32SUBT0552RM9X.html
  • 本文地址:https://www.linuxprobe.com/status-dynamic-linux.html编辑:黑曜羽,审核员:逄增宝
  • Linux命令大全:https://www.linuxcool.com/
  • Linux系统大全:https://www.linuxdown.com/
  • 红帽认证RHCE考试心得:https://www.rhce.net/

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
姆巴佩缘何在皇马四面楚歌?老佛爷签了一个被宠坏的孩子

姆巴佩缘何在皇马四面楚歌?老佛爷签了一个被宠坏的孩子

雪狼侃体育
2024-11-28 23:37:14
歼20一起飞就被越南雷达锁定了?真相让人不寒而栗!

歼20一起飞就被越南雷达锁定了?真相让人不寒而栗!

常高俊April工作室
2024-11-27 09:45:02
“非常极端,极度荒谬”

“非常极端,极度荒谬”

新京报
2024-11-27 09:55:37
股价提前起飞或因重组消息偷跑?这家公司说:已严格遵守保密义务

股价提前起飞或因重组消息偷跑?这家公司说:已严格遵守保密义务

标点财经
2024-11-29 14:49:39
邓小平5位子女现状如何?长子官至副国级,其余4个孩子也大有出息

邓小平5位子女现状如何?长子官至副国级,其余4个孩子也大有出息

历史龙元阁
2024-06-23 19:59:35
广州刚需,快被逼上绝路了

广州刚需,快被逼上绝路了

广州PLUS
2024-11-29 18:28:00
学生吐槽“有钱修草堂没钱建宿舍”调查:涉事学生已返校复课,学校称将更好倾听学生意见

学生吐槽“有钱修草堂没钱建宿舍”调查:涉事学生已返校复课,学校称将更好倾听学生意见

红星新闻
2024-11-29 17:30:18
明年3月国足主场曝光:足协启动考察,8万人非专业球场,迎战澳洲

明年3月国足主场曝光:足协启动考察,8万人非专业球场,迎战澳洲

小金体坛大视野
2024-11-29 12:46:40
太炸裂了!四川外援萨姆纳首节13中11爆砍25分

太炸裂了!四川外援萨姆纳首节13中11爆砍25分

直播吧
2024-11-29 20:19:12
大陆师生团访台第3天,马龙将与台湾乒乓球选手举行友谊赛

大陆师生团访台第3天,马龙将与台湾乒乓球选手举行友谊赛

凤凰卫视
2024-11-29 16:43:12
建丰先生的功德:台湾省有251个在册政党,每93230人就拥有一个

建丰先生的功德:台湾省有251个在册政党,每93230人就拥有一个

大风文字
2024-11-28 16:46:00
海外多数华裔球员想加入 国足 他们已经闻到美加墨世界杯气息

海外多数华裔球员想加入 国足 他们已经闻到美加墨世界杯气息

阿尢说历史
2024-11-28 15:10:36
黄晓明坐高铁时和乘务员的合照,这位工作人员比叶珂漂亮多了!​

黄晓明坐高铁时和乘务员的合照,这位工作人员比叶珂漂亮多了!​

人情皆文史
2024-11-28 01:02:07
辽宁“推妻坠海案”更多细节披露:2024最狠毒的男人出现了

辽宁“推妻坠海案”更多细节披露:2024最狠毒的男人出现了

李月亮
2024-11-28 20:47:03
最萌身高差!1米76杨溢同框2米23张子宇变娇小:女篮版姚明夺MVP

最萌身高差!1米76杨溢同框2米23张子宇变娇小:女篮版姚明夺MVP

李喜林篮球绝杀
2024-11-29 10:30:28
冯小刚宣布与妻子离婚,财产平分因爱上他人,网友热议不断

冯小刚宣布与妻子离婚,财产平分因爱上他人,网友热议不断

小啾咪侃侃史
2024-11-01 07:45:13
真的会有人一辆车开七八年都不换吗?网友:我已经开了十二年了!

真的会有人一辆车开七八年都不换吗?网友:我已经开了十二年了!

沙雕小琳琳
2024-11-29 15:49:42
事实证明,选择离开董明珠的孟羽童,最终已走上了一条“不归路”

事实证明,选择离开董明珠的孟羽童,最终已走上了一条“不归路”

博学老K杂谈
2024-10-29 17:20:02
我朋友,炒股近二十年,赚了三百多万,可是人家一件外套穿十多年

我朋友,炒股近二十年,赚了三百多万,可是人家一件外套穿十多年

人情皆文史
2024-11-27 04:17:58
租小米SU7拍大尺度后续,车主老婆接受不了,车卖掉又换小米

租小米SU7拍大尺度后续,车主老婆接受不了,车卖掉又换小米

杨哥历史
2024-11-28 14:16:37
2024-11-29 21:07:00
孙有匪
孙有匪
科技
1595文章数 2008关注度
往期回顾 全部

科技要闻

"AGI不是大杀器,是普通人每天在用的产品"

头条要闻

想要免死越南女首富"卖惨喊冤":只想尽快把财富交国家

头条要闻

想要免死越南女首富"卖惨喊冤":只想尽快把财富交国家

体育要闻

穆雷与德约科维奇能凑成王炸组合吗?

娱乐要闻

叶珂被曝独自去产检,他俩真分了吗

财经要闻

专家建议将农民养老金提升至每月500元

汽车要闻

问界M7今年累计交付量已突破18万辆

态度原创

手机
教育
时尚
本地
艺术

手机要闻

iQOO Neo 10 Pro上手:性能强劲外中规中矩,典型“帐篷机”

教育要闻

北京部分中小学校“爆改”围墙,背后的用意好暖……|教育观察

女人会不会穿衣区别很大!试试这些减龄的打扮,洋气又舒适

本地新闻

云游中国|来伦布夏果感受充满Passion的人生

艺术要闻

故宫珍藏的墨迹《十七帖》,比拓本更精良,这才是地道的魏晋写法

无障碍浏览 进入关怀版