博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux下库的制作(静态库与共享库)
阅读量:3949 次
发布时间:2019-05-24

本文共 1430 字,大约阅读时间需要 4 分钟。

库中实际上就是已编译好的函数代码,可以被程序直接调用。

Linux下的库一般的位置在/lib或者/usr/lib

静态库

静态库是复制拷贝到调用函数中的,函数运行的时候不再需要静态库,因为静态库是在链接的时候加进去的,所以当函数运行的时候,源库的改变对运行中的函数造成不影响。随之而来,当静态库升级之后,每一个调用静态库的程序都需要重新编译。

特点:

  • 链接静态库的时候,会把库中的相关代码拷贝到可执行文件中
  • 程序运行时不再需要静态库
  • 程序运行时不需加载库,运行速度快
  • 因为库中相关代码是拷贝到可执行文件中,所以占用了更多的磁盘和内存空间
  • 静态库升级之后需要重新编译链接

1.制作库的代码框架:

vim static_test.cgcc -c static_test.c -Wall                      #生成 .o 文件ar crs libstatic_test.a static_test.o            #静态库名字就是 static_test.a #注意: libxxx.a 是创建静态库的格式 其中 xxX.o 就是静态库的名字

还可以用nm libstatic_test.a来查询静态库中的符号信息,也就是函数名称:

在这里插入图片描述

2.调用库:

在调用库的函数中要声明调用的函数,不然会报错,然后在编译链接的时候加上静态库:

gcc -o test test.c -L. -lstatic_test#注意:gcc -o test test.c -L.(-L 是添加库搜索路径,这里库是在当前文件夹的) -l(指定要链接库名字xxx)#库名是static_test    库文件名是 static_test.a

编译器默认链接C库

3.执行:

通过调用静态库中的Hello函数来输出“Hello World”:

在这里插入图片描述

共享库

特点:

  • 共享库在链接的时候,仅仅是记录一下用到了哪个库中的哪个函数,并不复制库中相关代码
  • 多个程序可以同时调用一个共享库
  • 程序在运行的时候来加载共享库
  • 程序体积变小,程序本身没有包含库中的代码
  • 共享库升级之后,无需重新编译程序

1.生成位置无关代码

gcc -c -fPIC share_test.c -Wall

-fPIC表示生产的目标文件是位置无关代码,即可以放在程序的任何地方执行。

2.创建共享库文件

gcc -shared -o libshare_test.so.1 share_test.o

-shared来指定gcc创建一个共享库文件

libshare_test.so.1就是共享库文件名,.so表示是一个共享库文件,共享库文件命名格式为libxxx.so.x最后的x是版本控制,最后面包含的是目标文件,可以是多个目标文件

3.创建链接文件

为了编译器能够找到相应的共享库,需要一个链接文件:

ln -s libshare_test.so.1 libshare_test.so

第一个是目标文件,第二个是符号链接符号,其命名规则是libxxx.so(注意:链接文件没有版本控制)。链接文件相当于一个指针,指向共享库文件。

在这里插入图片描述

4.编译并链接共享库

gcc -o test test.c -L. -lshare

-L指定共享库的路径

-lxxx来表示链接文件

在这里插入图片描述

当静态库和共享库的链接文件名字一样时,优先使用共享库,但是也可以使用-static来指定静态库。

5.添加共享库的 加载路径

在这里插入图片描述

6.如何找到共享库

在这里插入图片描述

转载地址:http://btwzi.baihongyu.com/

你可能感兴趣的文章
行是知之始,知是行之成
查看>>
软件开发文档小结
查看>>
【UML】开发文档应用
查看>>
【UML】类图与用例图关系解析
查看>>
【SLA】理论学习阶段小结
查看>>
【C#】视频学习笔记(三)
查看>>
Power English 初始学习篇
查看>>
Mini Story 的正确打开方式
查看>>
【设计模式】基础篇
查看>>
【设计模式】六大设计原则篇
查看>>
【设计模式】理论整合+应用场景(一)
查看>>
【设计模式】理论整合+应用场景(二)
查看>>
《操作系统概论》调度算法小总
查看>>
二叉树遍历
查看>>
原码、反码、补码、移码举例
查看>>
Web Form框架(UI+BLL+DAL)学习
查看>>
【设计模式】比较篇
查看>>
【SQL Server】备份数据库失败:备份集中的数据库备份与现有的数据库不同
查看>>
【SQL Server】还原数据库失败:因为某些数据库功能在当前版本中不可用
查看>>
【SQL Server】还原数据库失败:设备上的媒体簇的结构不正确。错误:3241
查看>>