C++ 静态库、动态库制作和使用

文章目录

  • 前言
  • 一、C++ 静态库
    • 1、静态库的命名规则
    • 2、静态库的制作过程
    • 3、静态库的使用
  • 二、动态库
    • 1、动态库命名规则
    • 2、动态库制作过程
    • 3、动态库的使用
    • 4、动态库的加载
    • 5、配置环境变量
  • 总结


前言

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

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

库文件有两种,一种是动态库(共享库,dll) 一种是静态库(lib),都在链接阶段加入到可执行文件中,区别在于:静态库在程序链接阶段静态库文件内容被复制到程序中,动态库在程序链接阶段没有复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。静态中不能再包含其他的静态库和动态库,动态库可以包含其他的动态库和静态库。调用动态库中的函数时,根据函数映射表找到该函数并存入堆栈中,如果程序(也可以是其他程序)对同一函数有多处调用,执行时,这个函数只会有一份拷贝,静态库中的函数有多处调用会保存多个拷贝。

库的好处:1、代码保密,2、方便部署和分发。

一、C++ 静态库

1、静态库的命名规则

  • Linux:libxxx.alib为前缀,是固定的;xxx是自己起的库的名字;.a为后缀是固定的。
  • Windows:libxxx.lib

2、静态库的制作过程

  1. gcc -c 编译获得.o文件;
  2. .o文件打包,使用ar(archive)工具

打包命令:
ar rcs libxxx.a xx.o xx.o
r - 将文件插入备存文件
c - 建立备存文件
s - 索引

3、静态库的使用

通过使用头文件建立函的声明,在编译主函数时,使用以下命令

gcc -o app main.c -I ./头文件路径 -l 静态库名 -L ./静态库路径

二、动态库

1、动态库命名规则

  1. Linux:libxxx.solib为前缀,是固定的;xxx是自己起的库的名字;.so为后缀是固定的。
  2. Windows:libxxx.dll

2、动态库制作过程

  1. gcc -c 编译获得.o文件,得到和位置无关的代码,这将改变编译器生成特定操作的代码的方式,包括变量(全局、静态)、常量的访问以及获取函数的地址,这些改变可以让代码运行时放置到任意一个虚拟地址处。动态库在链接阶段不会打包到可执行程序中,而是把动态库的一些信息加载到可执行文件中。
    gcc -c -fpic/fPIC xx.c xxx.c
  2. 得到动态库
    gcc -shared xx.o xxx.o -o libxxx.so

3、动态库的使用

通过使用头文件建立函的声明,在编译主函数时,使用以下命令
gcc -o app main.c -I ./头文件路径 -l 动态库名 -L ./动态库路径
单独使用这个命令会报错,找不到动态库路径,报错原因和动态库加载模式有关

4、动态库的加载

  1. 通过ldd(list dynamic dependencies)命令可以查看动态库的依赖关系(小知识)
  2. 系统加载可执行代码时,需要依赖库的名字以及其绝对路径。系统会通过动态加载器来获取绝对路径。对于 elf (二进制文件)格式的可执行程序,它是由 ld-linux.so 来完成的,他先后搜索 elf 文件的 DT_RPATRH段(位于程序进程的虚拟地址空间中) -> 环境变量(LD_LIBRARY_PATH) -> /etc/ld.so.cache文件列表 -> /lib 或者/usr/lib目录,寻找库文件并将其载入内存。

5、配置环境变量

  1. 临时配置环境变量
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:我的环境变量绝对路径,$LD_LIBRARY是当然的环境变量。
  2. 用户级别环境变量配置
    在用户目录下打开.bashrc文件,在最后追加export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:我的环境变量绝对路径,并通过source .bashrc 或者 . .bashrc 刷新文件
  3. 系统级别环境变量配置
    sudo vim /etc/profile 打开配置文件;
    添加export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:我的环境变量绝对路径
    使用 source /etc/profile 或者 . /etc/profile 刷新文件
  4. 修改 /etc/ld.so.cache 文件
    sudo vim /etc/ld.so.conf
    添加export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:我的环境变量绝对路径
    sudo ldconfig
  5. .so文件放入/lib 或者 /usr/lib 文件中,但不建议这么做

总结

静态库
优点
加载速度更快,发布程序的时候无需移植静态库,移植方便;
**缺点:**消耗系统资源,浪费内存,更新、部署、发布麻烦,静态库文件内容直接被加载到程序文件中,更新时需要重新编译。

动态库的
优点:可以实现进程间的资源共享(不同进程都快访问,共享库)移植方便;更新、部署、发布简单(动态库更新时,不需要从新编译可执行程序文件);可以控制何时加载动态库(使用时才加载)。
缺点: 加载速度慢,发布程序时需要提供依赖的动态库。

你可能感兴趣的:(C++,c++,linux,服务器)