linux库之静态库与动态库

一、什么是库

       库是已经写好的,只需要调用,就可以使用的。我们平常写的代码、调用的函数名,都是在调用库。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。

1.2、库分为两种:

        1、静态库(linux下的库形式  :  xxxx.a   、 windows下的库形式  : xxxx.lib

            静态函数库,是函数执行前(编译)就加到目标程序中去了。
优点:
      (1)运行快。
      (2)发布程序无需提供静态库,因为已经在APP中,移植方便。
缺点:
      (1) 程序大。
      (2)链接时完整地拷贝至可执行文件中,别多次使用就有多份冗余拷贝。
      (3)更新,部署,发布较为麻烦

        2、动态库(linux下的库形式  :  xxxx.so 、 windows下的库形式  : xxxx.dll)   

 

二、程序编译的过程

编译一个C语言程序是一个多阶段的过程。从总体上看,这个过程可以分成四个独立的阶段。

         预处理——编译——汇编——链接

2.1、预处理

         将.c中的头文件,宏定义展开及替换,生成.i文件

命令:gcc -E xx.c -o xx.i(预处理器cpp对#做替换:头文件、宏,去掉注释,条件编译)

2.2、编译 

          将预处理之后的.i文件生成汇编代码.s文件

命令:gcc -S xx.i -o xx.s(编译器ccl 对程序 进行语法及词法分析)

2.3、汇编

          把.s汇编文件生成.o目标文件

命令:gcc -c xx.s -o xx.o(汇编器as将汇编代码 转换  机器码  )

2.4、链接

          把.o目标文件与库链接,生成可执行文件

命令:gcc xx.o -o xx(链接器ld将.o文件链接到一起生成可执行程序)

注意:xx.c 、 xx.i  、xx.s  都是文本文件

                                  xx.o  二进制文件

链接的时候需要链接到库,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行

三、为什么要学习库

3.1、问题:为什么要学习制作库,为什么要使用它,我们学习它为了什么?

首先,在我们工作中,我们写的代码,或者程序,都是为了客户服务。当客户使用我们的代码的时候,我们为了保密,我不想提供我的源代码给客户,因此出现了静态库,和动态库的使用。客户只需调用相对应的库,就可以实现功能。即不用给对方源代码,也不用被对方发现自己的代码写的不完美。

四,静态库的制作与使用 (格式libxxx.a

4.1、静态库命名规则

静态库文件名的命名方式是“libxxx.a”, lib 表示库,xxx 表示此静态库的名字,.a 表示静态库的后缀

4.2、制作库的流程

      首先:准备原材料(即功能.c文件) 比如:arithmetic.c

注意:不是main程序。

第一步:把原材料生成   xxx.o 文件

命令;  gcc    arithmetic .c    -c

   

 第二步:使用ar命令生成静态库文件

命令:  ar    -rcs    libarithmetic.a     arithmetic.o    

解析:把    arithmetic.o    文件生成   libarithmetic.a   静态库文件

 制作完成

五、静态库的使用

5.1、口诀:

              静态库文件砍头去尾,头+    “ -l ”

如:  (  libgongneng.a)红色字体,头跟尾————    -larithmetic

命令:gcc   主函数.c   -larithmetic   -o    执行文件

 找不到库文件,别慌,-l表示先从   usr/lib/  此路径找,但是,我们的库文件在当前位置,因此,会找不到,找不到的结果就是报错误。因此,需要再加个优先在哪找的指令   -L   ./(在当前位置)

命令:gcc   主函数.c   -larithmetic   -L   ./  -o    执行文件

  运行:./执行文件 

在我们工作中静态库使用的很少。

 一方面,比如某个产品使用了我提供的静态库文件,当此产品需要更新的时候,我还得再提供给它静态库文件。

另一方面,某个程序,某些功能都需要调用我提供的静态库 ,会出现冗余拷贝。什么意思,就是此产品程序中,有多份我提供的静态库文件,占内存。

而我们常常使用的是动态库。

六、动态库的制作与使用(格式libxxx.so

6.1、动态库的命名规则

动态库的命名方式与静态库类似,前缀相同,为“lib”,后缀变为“.so”。xxx 为动态库名

6.2、生成动态库

注意:是把功能.c程序生成库,并不是main程序

命令:  gcc -shared -fpic  功能.c  -o    libxxx.so          生成libxxx.so动态库

-shared:指定生成动态库
-fpic 标准,fPIC 选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码

 6.3、动态库的使用

和静态库一样的编译方式生成可执行文件时

命令:gcc   主函数.c   -larithmetic   -L   ./  -o    执行文件

 会报错,解决方法:

方法1:把库放在默认路径里,即/usr/lib/(不用,只需了解

命令:sudo cp  libxxx.so /usr/lib/                  将库拷贝到 /usr/lib/

              再运行 ——成功

 这种方法不使用,有可能会误改到其它库。     

 方法2:指定动态库的位置(有用,但不够完善)

               1.输入pwd获取目前路径

               2使用命令:  export  LD_LIBRARY_PATH="xxx" //xxx为pwd获取的路径

把此目前路径,通俗地讲,就是把此路径变成 为存放库的路径。类似  /usr/lib/

 但是,有个弊端,当我们再开个窗口时,编译程序的时候,会失败

因此,方法二,还得再改进,改进为方法三

方法三:也是最常用的方法

基于方法二的基础上编写写shell脚本(如  shell.sh)

脚本内容:

 一开始创建的脚本是无执行权限的,因此,需要赋执行权限。

使用命令:  chmod  +x   shell.sh

 你学会了??

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值