Linux动态库与静态库的创建和使用

编译过程

提及动态库与静态库,那么我们首先就要来说一下在我们Linux下程序的编译过程

  • 预处理 ( -E )
    (a) 头文件展开(文本复制)
    (b)进行宏替换
    ©条件编译
    (d)去掉注释

  • 编译 ( -S )
    语法语义纠错,无误后将源代码文件转换成汇编代码文件

  • 汇编 ( -c )
    将汇编代码转换成二进制机器代码

  • 链接
    将所有得到的目标文件和依赖的库文件进行汇总,得到最终的可执行文件。

以上就是我们Linux下的可执行程序的编译过程。

静态库与动态库

  • 可以看到在我们Linux下生成一个可执行程序,要链接我们的库文件,在Linux下库文件有两种,一种是静态库,一种是动态库。静态库默认后缀 (.a) ,动态库默认后缀 (.so)。

静态库生成

  • gcc -c *.c -o *.o
  • ar -cr lib+库名+.a后缀 *.o (c 为创建,r为替换)

静态库使用

  • 自己实现静态库实现加减运算

编写main1.c文件计算加减 在这里插入图片描述
编写加法函数
在这里插入图片描述
编写减法函数
在这里插入图片描述
头文件声明加减乘除函数
在这里插入图片描述
利用生成静态库方法生成静态库,运行main1.c输出 12 6 结果无误。
动态库生成

  • gcc -fPIC *.c -o *.o (-fPIC生成位置无关代码)
  • gcc -share *.o -o lib+库名+.so后缀 (–share 指定生成动态库)

使用库

  • gcc main.c -o main -l+库名 库文件有默认的搜索路径如 (/lib64 /lib)

  • 1、将我们自己生成的库文件放置指定的路径下即可,但这种方式不允许使用,有可能自己实现的库与系统库文件造成冲突

  • 2、设置环境变量
    链接库文件的链接路径 LIBRARY=./
    库文件运行时的加载路径 LD_LIBRARY_PATH=./
    设置环境变量完成后还要声明一下环境变量将环境变量放置系统环境变量中
    也可以用一句语句实现: export LD_LIBRARY_PATH=./(路径)
    注:这种方式有点缺点就是当终端关掉之后在启动,就会失效。

  • 3、找动态链接器配置文件(/etc/ld.so.conf),将动态库的绝对路径写入配置文件,更新 (sudo ldconfig)即可

自己实现动态库计算乘除

  • 编写main2.c计算乘除
    在这里插入图片描述
    编写乘法函数

    编写除法函数
    在这里插入图片描述
    头文件如上。
    利用实现动态库方法实现动态库,计算结果如下 12 3 结果无误。

选项参数

  • gcc -I :指定头文件的搜索路径
  • gcc -L :指定库链接的搜索路径
    注:若想要使用第三方静态库,不能使用gcc的-static选项,因为-static时生成静态链接可执行程序,所有的库都使用静态库(但我们只想这个第三方库使用静态库,而不是所有),因此我们是将第三方库拷贝到指定的路径下,使用-L选项指定库的链接搜索路径,那么这时候链接的就是静态库。

静态库与动态库的区别

  • 静态库
    优点
    1、发布程序的时候不需要提供对应的库,库就打包在我们的可执行程序中。
    2、因为库就在可执行程序中,故此,库的加载速度相对于动态库较快。
    缺点
    1、库被打包到应用程序中导致库的体积很大
    2、如果库发生改变,则需要重新编译程序
  • 动态库
    优点
    1、执行程序的体积小
    2、如果库发生改变,函数接口不变,则不需要重新编译程序
    缺点
    1、发布程序的时候,需要将库提供给用户
    2、动态库没有被打包到应用程序中,加载速度相对于静态库较慢

猜你喜欢

转载自blog.csdn.net/qq_43503315/article/details/89282109
今日推荐