动态库静态库基础概念

  • 静态库
    静态库不是一整个文件。而是一些.o文件的集合。
    链接器在链接静态链接库的时候是以目标文件(.o)为单位的,如果该静态库里的某些方法没有任何地方调用,则这些没有被调用到的方法或变量将会被丢弃掉,不会被链接到目标程序中,这样做可以大大减小生成二进制文件的体积。
  • 动态库
    在程序的链接阶段时,链接器只是拷贝了一些重定位和符号信息。在程序加载(execve)时才会解析so文件中代码和数据的引用。在程序运行的时候,被调用的动态链接库函数被安置在内存的某个地方,所有调用它的程序将指向这个代码段。因此,这些代码必须使用相对地址,而不是绝对地址。在编译的时候,我们需要告诉编译器,这些对象文件是用来做动态链接库的,所以要用地址无关代码(Position Independent Code (PIC))。
  • 库的优先级
    linux下进行连接的缺省操作是首先连接动态库
  • 库的搜索路径
    • Linux
      1、编译链接库时的搜索路径顺序(.a和.so)
      (1)-L选项指定的目录,例如:g++ -o test_fun test_fun.c -L. -lfun
      (2)-Wl,rpath指定的目录。例如:gcc -o foo foo.c -L. -lfoo -Wl,-rpath=./
      (3)环境变量LD_LIBRARY_PATH中设置的目录。
      (4)/etc/ld.so.cache文件中缓存的文件位置。
      (5)默认的/usr/lib或者/usr/lib64。
      2、程序运行时搜索动态库文件的顺序(.so)
      (1)-Wl,rpath指定的目录。例如:gcc -o foo foo.c -L. -lfoo -Wl,-rpath=./
      (2)环境变量LD_LIBRARY_PATH中设置的目录。
      (3)/etc/ld.so.cache文件中缓存的文件位置。
      (4)默认的/usr/lib或者/usr/lib64。
    • Windows
      1、动态库搜索路径
      (1)应用程序所在目录
      (2)当前目录
      (3)Windows SYSTEM目录
      (4)Windows目录
      (5)PATH环境变量指定的路径

参考:
Linux部分 14、静态和动态链接、环境变量

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容