C++动态库、静态库

  • 命名
  • 静态库制作
  • 静态库的使用
  • 静态库的优缺点
  • 动态库的制作
  • 动态库的使用
  • 动态库优缺点


常说C++静态库是程序链接阶段直接把库文件复制到程序中,动态库是在链接阶段没有被复制到程序中,而是在程序运行的时候由系统动态加载到内存中供程序调用。但是这么说,还是有点不明白,这是因为对库文件的本质不了解。

有这么一种定义:库文件是计算机上的一种文件,可以简单地把库文件定义成一个代码仓库,他提供给使用者一些已经定义好的变量、函数、类。这,不就是相当于python的库吗???相当于要使用别人的代码的时候,就pip install想要的代码。C++中的库也是酱紫,要用别人的,就引入。自己的代码也可以打包成库,包括动态库和静态库,在后续的开发中,自己可以用,别人也能用!!!

C++使用库有两个好处:

  • 代码保密
  • 方便部署和分发

命名

windows下:
libxxx.lib — 静态库
libxxx.dll — 动态库

linux下:
libxxx.a — 静态库
libxxx.so — 动态库

静态库制作

ar rcs libxxx.a xxx.o xxx.o

使用ar指令进行打包,rcs是参数,r代表将文件插入备存文件当中,c表示建立备存索引,s表示索引,libxxx.a表示使用后面的二进制.o文件生成一个名为libxxx.a的静态库。

静态库的使用

生成好了一个静态库文件.a,别人要使用你的库文件时,你也需要把相应的头文件提供给别人,要不然别人怎么知道你的库里面是什么东西呢?
当main.cpp要使用libxxx.a时,该这么编译:

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

解释:main.pp使用到了libxxx库,-o指定生成app为可执行二进制文件,-I指定include路径,-l指定使用的库文件,这个文件名不需要lib前缀,-L指定库文件所在的目录。

静态库的优缺点

优点

  • 静态库被打包到应用程序中加载速度快
  • 发布程序无需提供静态库,移植方便

缺点

  • 消耗系统资源,浪费内存
  • 更新、部署、发布麻烦

动态库的制作

# -fpic生成和位置无关的文件
gcc -c -fpic/-fPIC x.c
# -shared生成x.o的动态库
gcc -shared x.o -o libx.so

动态库的使用

和静态库的使用相同:

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

但是会出现找不到动态库的问题。因为动态库是在程序运行时,用到一个库的函数的时候再去库中找,所以需要知道库的位置在哪里。动态库的查找顺序一般如下:DT_RPATH段—》环境变量LD_LIBRARY_PATH—〉/etc/ld.so.cache文件列表—》lib, /urs/lib目录。如果都找不到,那么就报错。如果想要解决找不到动态库的问题,那么就在这些查找路径中加入相应的路径。

ldd(list dynamic dependencies)指令能查看可执行文件的动态库依赖

动态库优缺点

优点

  • 可以实现进程间资源共享
  • 更新、发布、部署简单
  • 可以控制何时加载动态库

缺点

  • 加载速度比静态库慢
  • 发布程序时,需要提供依赖的动态库

Android 动态库何时会被卸载_动态库