linux系统编程下的动态库和静态库

1、什么是库

1、有些人可能有些疑惑(这里的库和python里面的库c++里面的库有什么区别),其实作用是相同的,可以调用,方便使用,当时呢表达的方式不一样,c++里面的库其实别人写好的源文件或者是源代码,用户通过应用头文件来调用。这里库就像是一个程序,不能单独运行,并且库文件是计算机上的一类文件,可以简单的把库文件看成一种代码仓库,它提供给使用者一些可以直接拿来用的变量、函数或类;

2、库可以分为静态库和动态库(也叫共享库)区别:静态库就是在链接阶段就复制到程序里面,动态库在来链接时没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用,(这里后有讲到,需要配置环境,以至于可以找到动态库的路径,以便调用)

3、库的好处:代码保密好,方便部署

2、工作原理

1、静态库:gcc 进行链接时,会把静态库中代码打包到可执行程序中;

2、动态库: gcc进行链接时,动态库的代码不会被打包到可执行程序中;

3、程序启动之后,动态库会被动态加载到内存中,通过ldd(list dynamicdependencies)命令检查动态库依赖关系;

4、如何定位共享库文件呢?

当系统加载可执行代码时候,能够知道其所依赖的库的名字,但是还需要知道绝对路径。此时就需要系统的动态载入器来获取该绝对路径。对于elf格式的可执行程序,是由ld-linux.so来完成的,它先后搜索elf文件的 DT_RPATH段—>环境变量LD_LIBRARY_PATH —>/etc/ld.so.cache文件列表—>/lib/,/usr/lib目录找到库文件后将其载入内存。(即把动态库的绝对路径添加到环境变量等等任意一个中)

3、静态库的制作

1、命名规则:lib***.lib(Windows的)lib***.a(linux的)

2、步骤:1)gcc  获得 .o文件   2)把.o文件全部打包,用ar(archive)工具

ar rcs lib***.a ***.o   ***.o

静态库使用

gcc main.c -o app -I ./include/ -L ./lib/ -l xxx

说明:
(1)-I ./include/ 到指定文件夹搜索相应头文件
(2)-L ./lib/ 到指定文件夹搜索相应静态库
(3)-l xxx 指定要搜索的静态库名称

4、动态库的制作

linux命名规则:lib###.so  是一个可执行文件

Windows:lib###.dll

//gcc得到.o文件.得到和位置无关的代码
gcc -c -fpic/-fPIC a.c b.c
//gcc得到动态库
gcc -shared a.o b.o -o libxxx.so    //xxx指动态库名称

动态库的使用:

gcc main.c -o app -I ./include/ -L ./lib/ -l xxx
//如果只使用该命令则会报错,因为动态库不会被打包到可执行程序中,必须使用
//动态载入器将动态库中的代码加载到内存中即可
 
//方式1:配置临时变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/Linux/lesson6/library/lib
//说明:
//(1)/home/Linux/lesson6/library/lib为动态库的绝对路径
//(2)该方式配置的环境变量为临时的
 
//方式2:配置永久环境变量(用户级别)
vim .bashrc                            //打开该文件
//把该语句添加到bashrc中,保存并退出
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/Linux/lesson6/library/lib      
. .bashrc                              //使环境变量生效,其等价于 source .bashrc  
 
//方式3:配置永久环境变量(系统级别)
sudo vim /etc/ld.so.conf               //修改该文件
/home/Linux/lesson6/library/lib        //把该路径复制进去保存并退出
sudo ldconfig                          //更新

5、静态库动态库的对比

静态库:静态库被打包应用程序加载速度快,而且一直方便,只需要找到该目录的之下的静态库然后-L位置就行,但是也有缺点,消耗了资源,浪费了内存,并且更新部署比较麻烦,因为程序已经调用了库,而且都已经运行了,如果要更改,要么就是那种更新,然后重新安装。

动态库:可以实现进程间资源共享(共享库);更新、部署、发布简单;可以控制何时加载动态库(即只在使用时才会去加载),但是加载就会比较慢(一般那种大的库文件才会用动态库),而且个人认为部署比较麻烦。

  • 30
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值