Linux 您所在的位置:网站首页 静态函数库和动态函数库的区别 Linux

Linux

2023-08-09 20:47| 来源: 网络整理| 查看: 265

目录

一.库

二.静态库

三.共享库

一.库

1.库的定义

库是一组预先编译好的函数的集合,这些函数都是按照可重用的原则编写的。本质上,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。就是将源代码转化为二进制格式的源代码,相当于进行了加密,别人可以使用库,但是看不到库中的内容。简单的理解为中间文件的集合或某些功能代码的集合。

2.几种文件的存放路径

库文件:/lib 或 /usr/lib头文件:/usr/include可执行程序(命令):/bin 或 /usr/bin

3.库文件和头文件之间的关系

区别:

头文件是文本文件,是可供阅读的;库文件是二进制文件,不可直接阅读。头文件在编译中使用;库文件在链接中使用。头文件中是函数或定义的声明,及少量内联函数的使用,一般不包含非静态函数实现;库文件中包含函数的实现。头文件是手动编写的,库文件是编译生成的。

联系:

虽然没有规定调用库函数必须引用头文件,但一般约定,当调用库函数的时候需要引用接口函数所在的头文件。一个库文件均有一组头文件与其对应。 库文件和对应头文件的作者应为同一个。作者必须保证头文件中所声明的函数类型及参数列表,与库文件中的实现是相同的。

简单的来说,头文件中有函数的申明,库文件实现函数的定义。库文件通过头文件向外导出接口,用户通过头文件找到库文件中 函数实现的代码从而把这段代码链接到用户程序中去。

4.库文件的分类

静态库共享库 二.静态库

1.定义

静态库也是一种库文件,它在链接间段直接将库中的内容合并到最终的可执行文件中,所以静态库最终生成的可执行文件最终执行时,并不依赖库文件,即删除静态库,​但由于静态库方法已经被包含在了可执行程序中,则程序仍可执行,不再依赖于外部静态库。

2.静态库的优缺点

静态库的运行速度快,但程序体积相对较大,不易版本升级,若升级,则程序需要重新编译;

3.静态库的扩展名

               Linux中        Window中                    .a              .lib

4.静态库的前缀

lib

5.静态库的生成与使用

假设现在有如下的四个文件

my.h

int max(int a,int b); int add(int a,int b);

myadd.c

#include "my.h" int add(int a,int b) { return a+b; }

mymax.c

#include "my.h" int max(int a,int b) { return a>b?a:b; }

mymain.c

#include #include #include "my.h" int main() { int a=23; int b=33; printf("add=%d max=%d\n",add(a,b),max(a,b)); exit(0); }

接下来我们要将myadd.c 和 mymax.c制作成静态库

1首先我们将所有的 .c文件编译成 .o文件

使用命令

gcc -c myadd.c

gcc -c mymax.c

gcc -c mymain.c

2接着我们将 myadd.o 和 mymax.o 做成静态库,并将静态库起名为myfoo——静态库的生成

使用命令

ar crv libmyfoo.a myadd.o mymax.o

3最后我们直接编译mymain.c,并且使用静态库libmyfoo.a——静态库的使用

使用命令

gcc -o mymain mymain.c  -L  .  -lmyfoo

注:

上述命令中的libmyfoo.a,其中,lib代表的是静态库的前缀,.a代表的是静态库的后缀,只有二者中间的myfoo才代表静态库的名字。

静态库的使用方法

例如

三.共享库

1.定义

共享库与静态库不同,共享库在链接间段只在可执行文件中设置使用的库,运行时由操作系统动态加载到内存上执行。

2.共享库的优缺点

共享库是在运行程序时才动态加载库方法,若删除共享库,则程序运行时进行动态加载库方法时找不见共享库,程序将无法执行。共享库由于运行要动态加载库文件,则运行速度慢,但程序体积小,方便版本升级,程序不用重新编译

3.共享库的扩展名

            Linux中        Window中                .so              .dll

4.共享库的前缀 

lib

5.共享库的生成与使用

所用代码和静态库代码相同

1首先我们将所有的 .c文件编译成 .o文件,使用命令

gcc -c myadd.c

gcc -c mymax.c

gcc -c mymain.c

2接着我们将 myadd.o 和 mymax.o 做成共享库,并将共享库起名为MYfoo——共享库的生成

使用命令

gcc -shared -fPIC  -o  libMYfoo.so  *.o

因为操作系统只会加载 /lib 和 /usr/lib两条路径下的共享库,所以我们选择将libMYfoo.so放入/usr/lib路径下

注:这里要切换为管理员模式,因为普通用户的权限不够

命令

cp libMYfoo.so  /usr/lib

3最后我们直接编译mymain.c,并且使用共享库libMYfoo.so——共享库的使用

使用命令

gcc -o mymain mymain.c  -L  .  -lMYfoo

注:

上述命令中的libMYfoo.so,其中,lib代表的是共享库的前缀,.so代表的是共享库的后缀,只有二者中间的MYfoo才代表共享库的名字。

共享库的使用方法与静态库相同。

 

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有