# 静态库动态库和编译器

# 静态库

静态库(Static Library)是一种把一些函数或模块编译后,连成一个文件可以节省空间以及提高程序运行效率的库。 它以独立的文件形式存在,可以方便地被其它函数或程序使用,从而可以大大减少编程时间以及提高程序运行效率。

通俗的来说,静态库就是已经编码成了二进制,供给其他程序调用的一种文件格式

  • 他会在链接的时候,直接拷贝到目标程序中
  • 他的好处就是由于在同一个目标执行对象里,通常不存在依赖找不到的情况。
    • 由于已经编译好了,程序只要执行链接命令,在大程序中,会大大提高编译效率(动态库同理)
  • 但是也会带来一个比较大的问题,如果其被A,B同时需要,也会直接拷贝到两个目标里,结果程序编译出来非常大

# 动态库

动态库,又称共享库,是一种可重用程序资源,可以被加载并有效地共享的一种库。 与静态库(Static Libraries)不同的是,动态库只有在真正需要时才会被加载,这样可以有效地减少了内存空间的占用,提升了系统整体的性能。

和静态库相比,动态库被链接的时候,只会把函数在内存中初始化的地址加入

  • 这大大减少了编译时候,程序莫名臃肿的问题
  • 但也会带来一个比较严重的问题
    • 程序编译的时候,加入的只是指针的内存信息
    • 程序执行的时候,首先要求系统读取这个动态库,每个系统的动态库搜索方式又不太一样
    • 导致好不容易编译成功了,程序无法跑起来
    • 这在有多个手动编译的cxx库,并且放的位置还千奇百怪的情况下,非常难以处理程序依赖问题
  • 同时动态库还需要控制函数的导出问题,需要反汇编工具帮忙查看某个函数是不是被正常导出,或者找到对应的依赖(so调用另一个so的时候)

# 编译器如何链接库文件

编译的代码会有细节上的差异,但不会很大,参考链接 (opens new window)

这两者的链接思路是一致的,并不存在很大的差距,通常步骤如下:

  1. 指定库文件搜索路径
  2. 告诉编译器需要链接的文件名称
g++ test.cpp -L搜索路径 -l文件名(通常不需要后缀,编译器自动判断)

cmake的链接会更加智能一些,通常会在指定的链接目录里搜索目标, 如果是符合cmake规范的包,还可以通过project名称进行链接

Last Updated: 2/23/2023, 9:05:26 AM