(linux基础IO)编写简单的add/sub/mul/div函数,并打包成动/静态库,并分别使用

编写简单的add/sub/mul/div函数,并打包成动/静态库,并分别使用

  • 静态库(.a):在windows下后缀为(.lid),程序在编译链接的时候把库的代码链接到可执行文件里。程序运行的时候将不再需要静态库。
  • 动态库(.so):在windows下后缀为(.dll),程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。
  • 一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。
  • 在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程叫动态链接。
  • 动态库可以在多个程序间共享,所以动态链接使用可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一部分动态库被要到该库的所有进程共用,节省了内存和磁盘空间。

静态库

编写简单的add/sub/mul/div函数,并打包成静态库,并使用

第一步:分别创建.h.c文件

首先创建 add.h /sub.h /mul.h /div.h
在这里插入图片描述
内容如下:
在这里插入图片描述
然后创建 add.c/sub.c /mul.c /div.c
在这里插入图片描述
内容如下:
在这里插入图片描述

第二步:创建好.h 和 .c 文件之后gcc -c add.c sub.c mul.c div.c 编译生成.o文件
在这里插入图片描述

第三步:将编译生成的文件用以下命令生成静态库: ar -cr libsmath.a ./*.o
在这里插入图片描述

注意:这里的库名是叫smath,要生成静态库,需要给前面加上lib,后面加上.a。
ar是gnu归档工具,cr表示 create and replace
./*.o 表示的是当前目录下的所有的.o后缀文件

第四步:创建一个测试目录,将上一级的静态库和.h都拷贝过来
在这里插入图片描述

第五步:创建一个test.c文件来实现函数功能
.
创建的test.c文件内容如下:
在这里插入图片描述

第六步:生成可执行程序test: gcc test.c -o test -L. -lsmath在这里插入图片描述
命令的意思是在当前目录下查找库。-L. 指定库路径 -l 指定库名。
注意,在-l时要同时去掉前缀和后缀。
测试目标文件生成后,静态库删掉,程序照样运行。

动态库

编写简单的add/sub/mul/div函数,并打包成动态库,并使用

第一步:首先将上面创建好的代码拷贝到新目录下
在这里插入图片描述

第二步:通过gcc -c编译生成.o文件:命令[ gcc -fPIC -c ./*.c ] 不过这里要加上-fPIC:产生位置无关码,使它加载到哪里都能运行
在这里插入图片描述

第三步:生成动态库:gcc -shared ./*.o -o libdlib.so
shared:表示生成共享库格式,库(dlib)的前面加上lib后缀要加上.so
*.o 表示所有.o文件
在这里插入图片描述

第四步:创建一个测试文件,把头文件(.h)和动态库(.so)拷贝进去
在这里插入图片描述

第五步:把之前的test.c拷到当前目录
在这里插入图片描述

第六步:生成可执行程序: gcc test.c -o test -L. -ldlib
在这里插入图片描述中间不小心敲错,直接马掉

第七步:运行可执行程序
这里需要引入一个环境变量LD_LIBRARY_PATH,它是系统查找动态库的路径
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/PNUHC/article/details/91355323