【linux】静态库及动态库

动态库与静态库概念

1.静态库(.a)

程序在编译链接时把库的代码链接到可执行文件之中,程序运行的时间不需要依赖库。可移植性强,一旦编译成功不需要静态库,但是每一次都要讲代码链接进去,生成的可执行程序较大,浪费磁盘空间。

2.动态库(.so)

  • 程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。在程序运行时,才链接库,相比静态库执行代码少节省空间,可以共享(虚拟内存机制),但是可移植性差,不能删除。动态函数库(windows的文件后缀是.dll)与共享对象库(linux的后缀是.so)是一个东西
  • 一个与动态库链接的可执行文件仅仅包括它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。
  • 在可执行文件开始运行以前,外部函数的机器码由OS从磁盘上的该动态库复制到内存中这个过程叫做动态链接
  • 动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间,OS采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共有,节省了内存和磁盘空间。

库在连接以后引进进程说明了什么?

这个库复合翻译标准,不管是静态库,还是动态库都变为二进制,因为只有二进制才能把内容拿出来。

实现加法和减法的静态库

  • 先写好头文件与函数文件
    在这里插入图片描述
  • gcc -c sub.c -0 sub.o利用该指令生成二进制.o文件
  • ar -rc libmymath.a sub.o add.o将.o文件打成静态库
  • ar -tv libmymath.a(-t列出静态库的文件,-v详细信息)查看静态库的目录文件
  • gcc test.c -L -lmymath使用库 -L 指定库路径,-l指定匿名
  • 上述过程可以用makefile完成
libmymath.a:sub.o add.o
	ar -rc $@ $^
sub.o:sub.c
	gcc -c $^ -o $@
add.o:add.c
	gcc -c $^ -o $@
.PHONY:clean
clean:
	rm -rf *.o libmymath.a

  • 可以创建一个目录将静态库的文件放进去

在这里插入图片描述

使用gcc test.c -L ./COUNT/lib -lmymath -I ./COUNT/include便可调用静态库

库搜索路径
在这里插入图片描述

实现加法和减法动态库

  • 先写好头文件与函数文件
    在这里插入图片描述

  • gcc -fPIC -c sub.c add.c生成二进制文件

  • gcc -shared -o libmymath.so *.o生成动态库

  • gcc -L. -lmymath main.c 使用动态库

运行动态库另外方法

  • 将动态库拷贝到系统默认搜索路径,
  • 将动态库的路径加入到LD_LIBRARY_PATH

猜你喜欢

转载自blog.csdn.net/weixin_41892460/article/details/83277134
今日推荐