Linux之静态库&动态库

本文解析了静态库和动态库的概念及生成方法。动态库在Windows环境下后缀为.dll,在Linux环境下前缀为lib,后缀为.so;静态库在Windows环境下后缀为.lib,在Linux环境下前缀为lib,后缀为.a。文章还详细介绍了动态库和静态库的生成步骤及使用方法。

目录

一、静态库&动态库

1.1什么是库:

二、动态库

2.1特征:

 2.2生成:

三、静态库

3.1特征:

3.2生成:


一、静态库&动态库


1.1什么是库:


静态库和动态库都是程序代码的集合。一 般为了方便将程序提供给第三方使用,就是将程序编写成为库文件提供给第三方(用户)使用,那为什么将程序编写成库文件就不会泄漏源码了呢。这是因为将程序编写成库文件就会变成二进制的形式,而二进制的形式十分难破解

  • 好处:
    • 不会泄漏公司的源码(公 司赖以生存的秘密)调用者不必关系内部实现,只需要关注如何使用 (如何调用)即可

  • 对于这个软件:1、需要四各动态库,这四个动态库是独立编译的

    •                   2、编译软件的时候需要链接四个动态库
      • 方便维护

那么在维护的时候,就是哪个动态库有问题就维护哪个就行了

二、动态库

  • 2.1特征:

    • win:没有前缀,后缀为 dll
    • linux:前缀为lib,后缀为 .so

 2.2生成:

  • 使用gcc/g++编译器,增加两个命令行参数
  •     -fPIC                           //产生与位置无关的代码
  •     - shared                      //产生共享库
  • 生成动态库的代码当中不需要包含main函数(程序入口函数)

实现思路:

 下面我们来进行代码实现:

先写一个头文件   (提供给使用者的)

 再来写一个源文件    (产生动态库所使用的源文件)

在输入命令   gcc -fPIC -shared hello.c -o libhello.so   可以发现成功生成了动态库文件

 

使用ldd  mymain去查看

也确实能看到mymain这个可执行程序依赖动态库libhello。so

 

 使用:

  • 编译可执行程序的时候,依赖动态库
  • L [path] :指定动态库所在的路径
  • -l [动态库的名称(去掉前缀和后缀之后的名称) ] :指定编译可执行程序时, 依赖的动态库是那个。

我们之前是把动态库移到了当前目录下去进行链接的,

现在我们如果把动态库移动到上级目录的话会怎样呢?

 这时候能够发现,现在程序找不到动态库了,那么有时候方法能让程序去找到动态库呢?

都有哪些方式让程序可以找到动态库:

  • 1.将动态库放到可执行程序的路径下(不推荐)

刚刚我们实现可执行程序mymain的操作就是将动态库放到了执行程序的路径之下

  • 2.配置LD_ L IBRARY PATH,动态库的环境变量: LD _LIBRARY_ _PATH

下面我们来实现一下这个方法

先找到动态库的路径

 在把这个路径给添加过去

 我们再来看一下能不能找到

 我们可以看到,成功找到了动态库

三、静态库

  • 3.1特征:

    • win:没有前缀,后缀为。 lib
    • linux :前缀为lib, 后缀为,a

3.2生成:

  • 第一阶段:使用gcc/g++将 源代码编译成为目标程序(.o)

我们先写一个头文件hello.h

再写一个源文件hello.c

再把源文件编译为.o文件

 

  • 第二阶段:使用ar -rc命令编译日标程序成为静态库

 接下来调用静态库去运行下代码

我们会发现编译成功并且能够运行

 

 我们这时候再来看静态库的的依赖性关系

并没有找到对libhello.a的依赖关系

这是因为静态库有特性

在执行可执行程序的时候,静态库会编译到可执行程序内,不存在可执行程序对静态库的依赖关系 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值