> 首页 > 生活 > 百科 > 什么叫静态库和动态库

什么叫静态库和动态库

来源:网络 作者:佚名 时间:04-05 手机版

静态库是指在应用中,有一些公共代码需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中。这种库称为其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。

动态库又称动态链接库英文为DLL,是指DynamicLinkLibrary 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数,函数的可执行代码

什么叫静态库和动态库

两者区别:

一,静态库的使用需要:

1

包含一个对应的头文件告知编译器lib文件里面的具体内容

2

设置lib文件允许编译器去查找已经编译好的二进制代码

二,动态库的使用:

程序运行时需要加载动态库,对动态库有依赖性,需要手动加入动态库

三,依赖性:

静态链接表示静态性,在编译链接之后,

lib库中需要的资源已经在可执行程序中了,

也就是静态存在,没有依赖性了

动态,就是实时性,在运行的时候载入需要的资源,那么必须在运行的时候提供

需要的

动态库,有依赖性,

运行时候没有找到库就不能运行了

四,区别:

简单讲,静态库就是直接将需要的代码连接进可执行程序;动态库就是在需要调用其中的函数时,根据函数映射表找到该函数然后调入堆栈执行。

做成静态库可执行文件本身比较大,但不必附带动态库

做成动态库可执行文件本身比较小,但需要附带动态库

五:

首先纠正所谓“静态连接就是把需要的库函数放进你的exe之中”的说法。在真实世界中,有三个概念:use

static

libary,

static

linked

dll,

dynamic

linked

dll.

多数人混淆了static

libary

static

linked

dll的概念,当然他们有似是而非的“相似之处”,比如都用到.lib,下面具体说明。

使用静态库(use

static

libary)是把.lib和其他.obj一起build在目标文件中,目标文件可以是.exe,也可以是.dll或.oxc等。一般情况下,可以根本就没有“对应的”.dll

文件,如c

run

time(crt)库。一个例子就是,写一个main(){},build出来并不是只有几个字节,当然有人会说那还有exe文件头呢?是,即使加上文件头的尺寸,build出的执行文件仍然“莫名的大”。实际上那多出来的部分就是crt静态库。姑且可以把静态库.lib理解成外部程序的obj文件比较合理,它包含了函数的实现。

动态库和静态库的区别

我们通常把一些公用函数制作成函数库,供其它程序使用。

函数库分为静态库和动态库两种。

静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。

动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。

本文主要通过举例来说明在Linux中如何创建静态库和动态库,以及使用它们。

在创建函数库前,我们先来准备举例用的源程序,并将函数库的源程序编译成.o文件。

第1步:编辑得到举例的程序--hello.h、hello.c和main.c

hello.h(见程序1)为该函数库的头文件。

hello.c(见程序2)是函数库的源程序,其中包含公用函数hello,该函数将在屏幕上输出"Hello XXX!"。

main.c(见程序3)为测试库文件的主程序,在主程序中调用了公用函数hello。

程序1: hello.h

#ifndef HELLO_H

#define HELLO_H

void hello(const char *name)

#endif //HELLO_H

程序2: hello.c

#include

void hello(const char *name)

{

printf("Hello %s!/n", name)

}

程序3: main.c

#include "hello.h"

int main()

{

hello("everyone")

return 0

}

第2步:将hello.c编译成.o文件

无论静态库,还是动态库,都是由.o文件创建的。因此,我们必须将源程序hello.c通过gcc先编译成.o文件。

在系统提示符下键入以下命令得到hello.o文件。

# gcc -c hello.c

#

(注1:本文不介绍各命令使用和其参数功能,若希望详细了解它们,请参考其他文档。)

(注2:首字符"#"是系统提示符,不需要键入,下文相同。)

我们运行ls命令看看是否生存了hello.o文件。

# ls

hello.c hello.h hello.o main.c

#

(注3:首字符不是"#"为系统运行结果,下文相同。)

在ls命令结果中,我们看到了hello.o文件,本步操作完成。

下面我们先来看看如何创建静态库,以及使用它。

第3步:由.o文件创建静态库

静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。例如:我们将创建的静态库名为myhello,则静态库文件名就是libmyhello.a。在创建和使用静态库时,需要注意这点。创建静态库用ar命令。

在系统提示符下键入以下命令将创建静态库文件libmyhello.a。

# ar cr libmyhello.a hello.o

#

我们同样运行ls命令查看结果:

# ls

hello.c hello.h hello.o libmyhello.a main.c

#

ls命令结果中有libmyhello.a。

第4步:在程序中使用静态库

静态库制作完了,如何使用它内部的函数呢?只需要在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用gcc命令生成目标文件时指明静态库名,gcc将会从静态库中将公用函数连接到目标文件中。注意,gcc会在静态库名前加上前缀lib,然后追加扩展名.a得到的静态库文件名来查找静态库文件。

在程序3:main.c中,我们包含了静态库的头文件hello.h,然后在主程序main中直接调用公用函数hello。下面先生成目标程序hello,然后运行hello程序看看结果如何。

# gcc -o hello main.c -L. -lmyhello

# ./hello

Hello everyone!

#

我们删除静态库文件试试公用函数hello是否真的连接到目标文件 hello中了。

# rm libmyhello.a

rm: remove regular file `libmyhello.a'? y

# ./hello

Hello everyone!

#

程序照常运行,静态库中的公用函数已经连接到目标文件中了。

我们继续看看如何在Linux中创建动态库。我们还是从.o文件开始。

第5步:由.o文件创建动态库文件

动态库文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀lib,但其文件扩展名为.so。例如:我们将创建的动态库名为myhello,则动态库文件名就是libmyhello.so。用gcc来创建动态库。

在系统提示符下键入以下命令得到动态库文件libmyhello.so。

# gcc -shared -fPCI -o libmyhello.so hello.o

#

我们照样使用ls命令看看动态库文件是否生成。

# ls

hello.c hello.h hello.o libmyhello.so main.c

#

第6步:在程序中使用动态库

在程序中使用动态库和使用静态库完全一样,也是在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用gcc命令生成目标文件时指明动态库名进行编译。我们先运行gcc命令生成目标文件,再运行它看看结果。

# gcc -o hello main.c -L. -lmyhello

# ./hello

./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory

#

哦!出错了。快看看错误提示,原来是找不到动态库文件libmyhello.so。程序在运行时,会在/usr/lib和/lib等目录中查找需要的动态库文件。若找到,则载入动态库,否则将提示类似上述错误而终止程序运行。我们将文件 libmyhello.so复制到目录/usr/lib中,再试试。

# mv libmyhello.so /usr/lib

# ./hello

Hello everyone!

#

成功了。这也进一步说明了动态库在程序运行时是需要的。

我们回过头看看,发现使用静态库和使用动态库编译成目标程序使用的gcc命令完全一样,那当静态库和动态库同名时,gcc命令会使用哪个库文件呢?抱着对问题必究到底的心情,来试试看。

先删除 除.c和.h外的 所有文件,恢复成我们刚刚编辑完举例程序状态。

# rm -f hello hello.o /usr/lib/libmyhello.so

# ls

hello.c hello.h main.c

#

在来创建静态库文件libmyhello.a和动态库文件libmyhello.so。

# gcc -c hello.c

# ar cr libmyhello.a hello.o

# gcc -shared -fPCI -o libmyhello.so hello.o

# ls

hello.c hello.h hello.o libmyhello.a libmyhello.so main.c

#

通过上述最后一条ls命令,可以发现静态库文件libmyhello.a和动态库文件libmyhello.so都已经生成,并都在当前目录中。然后,我们运行gcc命令来使用函数库myhello生成目标文件hello,并运行程序 hello。

# gcc -o hello main.c -L. -lmyhello

# ./hello

./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory

#

从程序hello运行的结果中很容易知道,当静态库和动态库同名时, gcc命令将优先使用动态库。

C语言里面的动态库和静态库

之所以成为【静态库】,是因为在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接。

试想一下,静态库与汇编生成的目标文件一起链接为可执行文件,那么静态库必定跟.o文件格式相似。其实一个静态库可以简单看成是一组目标文件(.o/.obj文件)的集合,即很多目标文件经过压缩打包后形成的一个文件。静态库特点总结:

为什么需要动态库,其实也是静态库的特点导致。

动态库特点总结:

生成动态库

相关推荐:

什么叫静态库和动态库

诸葛亮为什么会追随刘备

什么叫静力性训练

洛克王国的这个东西是什么

为什么孔子对乡原之人嫉之如贼

什么叫精子

洛克王国多灵主技能石效果是什么

孔子为什么被称为万世师表

标签: [db:标签]

声明:《什么叫静态库和动态库》一文由排行榜大全(佚名 )网友供稿,版权归原作者本人所有,转载请注明出处。如果您对文章有异议,可在反馈入口提交处理!

最近更新

  • 什么叫静态库和动态库

    静态库是指在应用中,有一些公共代码需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执...

    百科 日期:2023-04-05

  • 诸葛亮为什么会追随刘备

    首先是诸葛亮的为人,葛亮之所以深受历代知识分子的推崇,一个重要的原因就在于他是一个理想的儒家士子,是榜样和标尺。这个榜样和标尺,主要是指高...

    百科 日期:2023-04-05

  • 什么叫静力性训练

    静力性训练应该是不用器械进行锻炼 静力力量的特点和训练安排 肌肉对抗固定阻力时所表现出来的力量称为静力性力量。肌肉在表现静力性力量时...

    百科 日期:2023-04-05

  • 洛克王国的这个东西是什么

    《洛克王国》是由魔方工作室开发,腾讯公司发行的一款在线绿色社区网页游戏,于2010年发行。游戏以社区魔法王国为主题,在其中融入了各种古老的传...

    百科 日期:2023-04-05

  • 为什么孔子对乡原之人嫉之如贼

    乡原即乡愿,大体等于现在说的好好先生。这些人貌似好人,其实是对是非判断毫无原则,对坏人坏事不敢批评,甚至助纣为虐,滋长了不良风气,因此比直接做...

    百科 日期:2023-04-05

  • 什么叫精子

    精子分动物精子与植物精子。动物有性生殖过程中的雄性细胞,雄性动物的生殖细胞,异配生殖中的雄配子,由精子器产生的单倍体生殖细胞。而生活中精...

    百科 日期:2023-04-05

  • 洛克王国多灵主技能石效果是什么

    洛克王国多灵主专属的技能石一共有两块,一块是暗夜之光技能石,另一块是混沌之初技能石,这两块技能石是通过到巨石水晶台刷生命蓝灵,获得生命微粒...

    百科 日期:2023-04-05

  • 孔子为什么被称为万世师表

    这个是有历史发展过程的,汉朝的时候,董仲舒废黜百家,独尊儒术,为了统治阶级的统治,对儒家思想进行了一些篡改,儒家思想成为了主流意识形态。隋朝开...

    百科 日期:2023-04-05

百科排行榜精选

邮箱不能为空
留下您的宝贵意见