Linux 静态库/动态库的制作与使用(通俗易懂)

一、什么是库

1、库文件是计算机上的一类文件,可以简单的把库文件看成一种代码仓库,它提供给使用者一些可以直接拿来用的变量、函数或类;

2、库是特殊的一种程序,编写库的程序和编写一般的程序区别不大,只是库不能单独运行;

3、库文件有两种,静态库和动态库(共享库),区别是︰静态库在程序的链接阶段被复制到不程序中;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用;

4、库的好处: (1)代码保密;(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目录找到库文件后将其载入内存。(即把动态库的绝对路径添加到环境变量等等任意一个中)

三、静态库的制作与使用

1、静态库的制作 

gcc 获得.o 文件,将.o 文件打包,使用ar工具(arghive)

ar rcs 1ibxxx.a xxx.o xxx.o    

说明:
(1)r-将文件插入备存文件中
(2)c-建立备存文件
(3)s-索引
(4)1ibxxx.a中xxx是静态库的名称 

2、静态库的使用

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

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

四、动态库的制作与使用

1、动态库的制作

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

2、动态库的使用

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                          //更新

五、静态库与动态库的对比

 1、静态库的优缺点

(1)优点:静态库被打包到应用程序中加载速度快;发布程序无需提供静态库,移植方便;

(2)缺点:消耗系统资源,浪费内存;更新、部署、发布麻烦(即如果修改了静态库函数,需要重新进行编译);

2、动态库优缺点

(1)优点:可以实现进程间资源共享(共享库);更新、部署、发布简单;可以控制何时加载动态库(即只在使用时才会去加载);

(2)缺点:加载速度比静态库慢;发布程序时需要提供依赖的动态库;



 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Linux 是一种开源操作系统,也是计算机世界中最重要的操作系统之一。它的主要目标是为用户提供稳定、可靠、高效的计算环境。与其他操作系统相比,Linux 的一个显著特点是它的开放性与自由性。任何人都可以免费获取、使用、修改和分发 Linux 操作系统。 要理解 Linux,首先需要了解 Linux 的基本概念和特点。Linux 是一个多用户、多任务的操作系统,这意味着多个用户可以同时登录使用系统,同时执行多个任务。它具有良好的稳定性和安全性,可以有效地保护用户的数据和系统。此外,Linux 还有一个庞大的软件库,可以满足各种各样的用户需求。 学习 Linux 的过程可以分为两个阶段。首先是了解 Linux 的基本命令和文件系统结构。Linux 使用命令行界面,所以学习常用的命令非常重要。一些常用的命令有:cd (进入目录)、ls (列出目录内容)、mkdir (创建目录)、rm (删除文件)、cp (复制文件)等。此外,还需要了解 Linux 的文件系统结构,例如根目录、用户目录、系统目录等。 第二个阶段是学习 Linux 的高级特性和应用。Linux 提供了丰富的网络功能,可以用于搭建 Web 服务器、数据库服务器等。另外,Linux 还支持多种编程语言和开发工具,如 C、C++、Python、Java 等。学习这些高级特性和应用可以帮助用户更好地利用 Linux 来完成各种任务。 为了更好地理解和学习 Linux,建议使用一些通俗易懂的教材。这些教材通常会从浅入深地介绍 Linux 的概念和特点,通过一些实例演示如何使用 Linux,并提供一些练习题来帮助读者巩固所学内容。此外,网络资源也是学习 Linux 的好帮手,可以参考一些在线教程和论坛,与其他 Linux 用户交流经验。 总之,学习 Linux 需要一定的时间和耐心,但掌握了 Linux,将为你带来更多的机会和可能。希望上述的回答对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据库内核

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值