Linux的静态库与动态库

2022/3/22 7:28:20

本文主要是介绍Linux的静态库与动态库,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1.介绍

使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级。
程序函数库可分为3种类型:静态函数库(static libraries)、共享函数库(shared libraries)、动态加载函数库(dynamically loaded libraries)。

1、静态函数库,是在程序执行前就加入到目标程序中去了 ;
优点:运行快,发布的时候无需提供静态库,以为已经在app中了,移植方便。
缺点:程序大,链接时完整地拷贝到可执行文件中,被多次使用就有了多份冗余拷贝。更新、部署、发布麻烦

2、动态函数库同共享函数库是一个东西(在linux上叫共享对象库, 文件后缀是.so ,windows上叫动态加载函数库, 文件后缀是.dll)
优点:灵活,程序小。链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序可以共用,节省内存。程序升级较为简单,因为app内没有库的源码,升级之后只要库的名字不变,函数名以及参数不变,只是实现做了优化,就可以加载成功。
缺点:加载速度比静态库慢,发布程序需要提供依赖的动态库。
请添加图片描述

2.静态库的制作与使用

命名规则
静态库文件的命名方式是"libxxxx.a",库名以 .a 结尾,前面加上lib, xxx自己取。

制作步骤
1、源代码 .c 或者 .cpp
2、将 .c 文件生成 .o 文件,使用

gcc xxx.c xxx.o -c

3、将 .o 文件打包,生成 .a 文件, 使用命令

ar rcs libxxx.a xxxx1.o xxxx2.o

(这里xxx.o也被称为原材料,就是说你使用xxxx.o这份原材料打包出一个静态库)
4、使用库,

 gcc main.c -lxxxx 

但直接使用会出现错误,因为使用 -l 会优先去系统找请添加图片描述
我们应该加上 -L ,表示先到指定路径去找 (默认是从/usr/lib /usr/local/lib去找), -o表示生成执行文件

 gcc main.c -lxxxx -L ./ -o xxx  

3.动态库的制作与使用

命名规则
动态库文件的命名方式是"libxxxx.so",库名以 .so 结尾,前面加上lib, xxx自己取,与静态库的命名差不多。

制作步骤
1、将源文件.c 生成 .so文件 ,需要加一个参数 fpic
这里可能会出现一些错误,建议第一、二步连起来。
2、加上 -shared,生成 .so文件 ,
-shared 指定生成共享动态库
-fpic 表明使用地址无关代码。PIC:Position Independent Code

gcc -shared -fpic 功能文件.c -o libxxxx.so

3、使用,例子如下

gcc jisuan.c -lfuns -L ./ -o jisuan

但这里也会出现某些错误,显示打不开动态库或者找不到。这里需要把生成的动态库文件libxxxx.so移到 /usr/lib/libxxxx.so,因为程序会默认到这里来找,另外一个方法就是配置环境变量,但这只对于当前shell有用; 还有就是更改配置信息。

4、指定动态库位置

1、到 /etc/ld.so.conf.d添加自己动态库文件的所在路径,但貌似没什么作用。
后来找到了失败的原因,没有刷新缓存.

ldconfig

2、配置环境变量,但只对于当前shell起作用,可以使用脚本完成。
首先编写shell脚本

export LD_LIBRARY_PATH="/xx/xx/xxx/" 此处为动态库所在的路径
./xxxx   此处xxx表示你生成的执行文件

写好脚本后,使用命令为脚本添加执行权限

chmod +x start.sh 


这篇关于Linux的静态库与动态库的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程