动静态库

  1. 静态库:
    文件扩展名:.a
    链接方式是在编译时候直接集成到可执行文件中。

  2. 动态库
    文件扩展名字:.so
    链接方式是在运行时,根据符号表查找动态库的位置

  3. 库文件:就是把多个“.o文件”打一个包,给对方提供一个库文件。
    使用ar命令生成静态库
    ar -rc libmymath.a add.o sub.o

  4. 交付库-》库文件.a .so +匹配的头文件都给别人。所谓的安装:本质就是拷贝

  5. 如果需要链接第三方的库,必须指明库名称!!!

gcc会默认指定c语言的标准库,g++会自动指定c++的标准库

库的名称是去掉前缀和后缀,比如libmymath.a 那么库的名字叫mymath,-lmymath

  1. gcc默认是动态库。

  2. 系统中,通过拷贝来实现安装。

  3. 动态库:
    生成动态库:对于每个.c文件需要 gcc -c -fPIC my_add.c 生成.o文件,然后使用 gcc -share -o lib my math.so my_add.o my_sub.o

运行动态链接的执行文件:与静态链接的可执行文件(gcc只需要在编译时候指明路径和文件名字)不同。
动态链接的路径指明方式是:

  • 修改环境变量中的动态库的路径:$LD_LIBRARY_PATH
  • 修改环境变量
  • 使用软链接在本地路径下生成一个新的文件,这样子也可以找到。

ncourses 库(第三方库)

  1. 静态库加载:
    虚拟地址空间,可执行程序在编译时候就考虑到虚拟地址。静态库加载进代码区。

  2. 动态库加载:动态库中的指定函数的地址,写入到我们的可执行程序中。动态库中函数只需要填入在库中的偏移量地址数。在可执行程序需要执行一个外部动态库的函数的时候,会把动态库加载进内存,通过页表映射到pcb中的共享区,那么只需要库在共享区的起始地址和函数在动态库的偏移量地址。就可以找到函数的代码了。

在内存中,就算有一百个可执行程序需要使用同一个动态库,那么这个动态库在内存中只会有一份,而且是通过映射的方式存在于可执行程序中。

posted @ 2024-10-03 14:00  zhudachang  阅读(2)  评论(0编辑  收藏  举报