Hi,您好,欢迎来到西安盛图软件科技有限公司!

动静态库的创建 | 使用 | 加载

发布时间:2024-01-25 13:47:47

动静态库的介绍

静态库( .a ):在程序编译的时候,把库的代码链接(拷贝)到可执行程序。

动态库(.so):在程序的执行时,链接动态库的代码。多个程序同时共享代码。

创建一个静态库:
创建计算器,带有加减乘除功能。

声明和定义分离。创建文件

静态库的打包

一:生成 .o文件

为了简化操作,我们只测试加法功能

创建testadd目录 将Add.o文件移动到testadd目录,创建一个简单的test代码

包含上层目录的Add.h头文件

将test.c文件编译成test.o文件 

因此用户可以通过包含头文件的形式 再编译成可执行文件 

因此通过将.o文件和.h文件打包给别人,别人就能使用库。

这一个将.o文件拷贝编译生成可执行可执行程序的过程就是静态链接。

但是有果有许多的.o文件,打包起来就很繁琐,用户使用也不舒服。

介绍第二种方式

二、借助ar指令简化

1)生成静态库

ar是gun归档工具,常用于目标文件打包成静态库

r-c表示replace-create

指令:

生成静态库libmymath.a

通过 ar - tv指令查看静态文件中的目录列表

2)将头文件和库打包(发布)

将我们的库给别人实际上是给出俩个文件。一个文件包含库,一个文件包含头文件
使用者只需要包含头文件就能使用我们的库文件

下面修改我们的Makefile自动化建构文件

创建mymath_lib目录

底下包含俩个子目录

include (用来放头文件)

lib(用来放库文件)

make构造

tree查看目录mymath_lib

这样就完成对静态库的创建,如果我们想发送出去。我们还可以进行cxz压缩文件


静态库的使用

我们有一份静态库mymath_lib

在使用时,必须指明链接哪一个库,哪个路径

如果直接gcc编译会出错

原因是找不到库     " "会再当前目录下寻找文件,找不到再全系统目录下寻找

方法一:(不推荐)
将mymath_lib的头文件和库文件分别拷贝到系统目录中
系统头文件一般在/user/include/路径下
系统库文件一般放在/lib64/路径下
然后编译的时候通过  gcc 文件名 +l指明要链接的第三方库的名称
不推荐的原因操作相对繁琐,会污染系统库,不想使用了需要自行删除

方法二:(推荐)

在gcc编译时候 ,通过-I(小写i) 和 L(大写L)指定路径和库

动态库的打包

动态库的创建,大致与静态库相同,有些许差异
下面新建一个目录,存放计算器的四个.c和.h文件

第一步:生成.o文件并打包

生成.o文件之后,不再使用ar打包而是在gcc 选项之后添加shared
下面依旧利用自动化构建工具(先生成.o在整合生成.so)
与静态库生成不同的是,动态库完全由gcc就能完成

第二步:发布

与静态库的生成一样,需要将库发布。发布就需要放在同一个目录下的俩个不同目录下

创建库目录my_math_lib

子目录 include放头文件

            lib放库 .so

完善我们的自动化构建

增加output功能

 tree一下结构

完成动态库的制作和发布

动态库的使用

在该路径底下只有动态库文件和用户.c文件

上一篇:面试官:分库分表后如何生成全局 ID?
下一篇:C++性能优化大局观