【Linux小练习】打包并使用动静态库


前言

【万字详解Linux系列】文件系统、动静态库 中提到了文件系统和动静态库,本文分别打包一个动、静态库并使用它们来加深对动静态库的理解。


一、打包静态库

1.函数声明和函数实现

先生成两个.h的函数声明和两个同名.o的函数实现文件,然后打包加法、减法静态库(这里重点是打包静态库的过程,所以代码部分使用简单的加减法)
在这里插入图片描述
四个文件里面的代码如下,非常简单。
在这里插入图片描述


2.makefile

由于四个文件用没有main函数,所以makefile需要如下编写。

mylib=libcal.a
CC=gcc

$(mylib):add.o sub.o
    ar -rc $(mylib) $^
%.o:%.c
    $(CC) -c $<

.PHONY:clean
clean:
    rm -f $(mylib) *.o

在这里插入图片描述

make后可见两个.o文件和静态库已经产生。
在这里插入图片描述


上面的makefile看起来很复杂,实际上就是将下面的命令用符号替换而已。
在这里插入图片描述


一般打包好的静态库是给别人用的,但又不希望别人知道静态库的实现方式,所以就把.h文件(函数功能、用法,相当于库的说明书)和静态库(完成功能)给别人,这样他就可以正常使用你的静态库但无法知道是如何实现的。

更新makefile如下:

在这里插入图片描述

之后make clean清理资源,再make生成静态库和.o文件,然后make output生成mathlib目录,通过tree可以看到mathlib目录下的内容。
在这里插入图片描述
至此,mathlib内就包括静态库(libcal.a)及其中函数的声明(add.h和sub.h),有了mathlib,别人就可以使用其中的函数来实现功能。


二、使用静态库

下面在dir(这个目录和上面含有函数实现的不是一个目录)下使用mathlib这个静态库中的函数实现功能。

在这里插入图片描述


创建test.c并写入如下内容:
在这里插入图片描述
下面是直接暴力编译的过程,旁边的文字内容很重要,请注意每一个选项及其后的内容,细节很多。
在这里插入图片描述


但是显然这样的使用方法太过复杂了,究其原因是因为自己实现的头文件和静态库不在系统对应的路径下,所以不能直接使用。

那么就直接把头文件和静态库分别拷贝到系统对应的路径下,这样就不需要使用那么多选项来指定了。

在这里插入图片描述
刚刚将头文件和静态库分别拷贝到系统对应的路径下其实就是静态库安装的过程,安装后就可以正常运行。当然,我上面实现的库没什么用,所以最好尝试结束后删除,删除也就是卸载了这个静态库。


三、动态库

仍是之前的2个.h文件和2个.c文件,首先先编译形成.o文件,要注意的是需要加-fPIC选项产生位置无关码。
在这里插入图片描述


形成.o文件后再用-shared选项和-o选项产生动态库(注意后缀是.so)。
在这里插入图片描述


然后将.h文件和动态库放入一个文件夹,这就是最终的整个可使用的动态库。
在这里插入图片描述


仍像之前静态库一样指定一系列路径(给gcc编译器)才能通过编译,但之后直接运行发现运行失败,因为这时(操作系统)找不到动态库的位置了。

在这里插入图片描述


这时可以像前面一样把头文件和动态库都拷贝到系统对应的路径下,但这里再介绍一种方法:向LD_LIBRARY_PATH(是一个环境变量)中导入动态库的路径。
在这里插入图片描述


感谢阅读,如有错误请批评指正

猜你喜欢

转载自blog.csdn.net/weixin_51983604/article/details/123296371