linux下动静态库的制作,打包,以及模拟第三方库使用
创始人
2024-04-02 05:06:15
0

目录

一,动静态库的制作与打包

二, 动静态库的使用

静态库的使用

1,直接拷贝到系统路径下,

2,方法二,进行指定,

动态库的使用

1,动态库使用第一中方法和静态库一样

2,进行指定+导入环境变量

3,通过配置文件

4,通过创建软链接

 第三,总结


一,动静态库的制作与打包

这里我们以makefile统一制作。

 

这里代码都有详细的注释,当然不想用makefile的话也可以把makefile中的指令拿出来一条一条自己单独拿出来在命令行上面执行。

最后我们把执行好的.o文件打包,这里静态的_s.o,是因为重复了,一样的,这里我们知道统一都是二进制可执行文件就好了。也就是gcc -c 生成的。

编译好之后我们进行打包:最后打包好俩个文件夹:

我们将来写库给别人用的话,就把这俩个打包好的文件给别人就好了,别人就可以使用了。

二, 动静态库的使用

静态库的使用

1,一下就是我们打包好的静态库,在lib-static文件下有俩个小文件,一个include文件,里面放的是所有的头文件,一个是lib小文件,里面放的是我们的.o编译好的二进制目标文件。也就是我们自己实现的库。

 一下是我们的使用方式:

当我们编译时我们发现,头文件是找不到的,这是为什么呢?

我们找头文件有俩种方式

第一:<>去系统路径下去找,这里显然没有的,我们自己实现的库嘛,

第二:""去当前目录下去找,显然也是不在的,所以一定是找不到呢。 

那么如何解决呢?

我们这里先介绍俩种种使用方法,后面再动态库的使用中将会有其他的几种方法。

1,直接拷贝到系统路径下,

系统的库文件一般在/lib64,我们拷贝过去。

系统的头文件一般在/usr/include/我们也把头文件拷贝过去。

检查:我们ls 查看,发现以及拷贝过去了。

 

再次头文件拷贝,检查:

当我们再次gcc编译时,发现还不可以,但是这次报的不是头文件找不到了,而是没有发现函数定义,也就是gcc找不到库了。为什么呢,因为我们之前使用的是标准库,gcc默认都是可以找到的,

现在我们使用我们自己的实现的库,也就是我们将来可能会用到的第三方库,系统当然能找不到了,所以我们直接 -l指定要链接的库;

之后我们就编译出可执行程序了:

运行也是没有问题的,

此时我们刚才添加到系统中的库,头文件都删除了,发现也是依然可以指向的,因为

静态库编译好之后就不依赖库了。

2,方法二,进行指定,

我们不想直接拷贝到系统目录下面,毕竟我们写的不一定好啊

需要三个参数进行指定

-i(大写):后跟头文件查找路径
-L(大写):后跟库文件查找路径
-l(小写):再指定路径下你要链接哪一个库

我们指定之后发现可以了,因为gcc现在可以找到他需要的东西了,

我们发现这样生成的可执行程序也是可以跑的:

但是这种方法要指定,如果比较多的话那就比较麻烦了。

动态库的使用

1,动态库使用第一中方法和静态库一样

也就是拷贝到系统目录下面。

2,进行指定+导入环境变量

和静态库,一样,我们还是指定,gcc就可以找到了,也生成了可执行程序。

 但是当我们跑的时候,动态库出问题了。

 我们发现打不开那个文件,声名意思呢,还是找不到了。为什么呢?我们刚才指定的时给gcc编译器说的,但是关我进程什么事啊???我进程还不知道了,拿为什么静态库知道呢,因为静态库编译时直接把库代码拷贝进可执行程序了,之后的执行就不依赖库了。但是动态库,不行,我们指定成成了,进程还是找不到。

我们发现找不到:

这里为了让进程也能找到,我们需要设置环境变量:通过导入环境变量的方式,程序运行时会自己在环境变量LD_LIBRARY_PATH中查找自己所

导入环境变量

检查

之后我们再去执行,就完全能ok了

但是注意,这种导入环境变量的方式是内存级别的,当进程一关就没有了,需要重新设置

3,通过配置文件

dconfig 配置/etc/ld.so.conf.d/,ldconfig更新

我们在/etc/ld.so.conf.d/路径下随便touch创建一个文件,然后用vim打开,写入我们的库路径

之后我们发现还是不可以,依然找不到,我们的进程太苦了啊。还是找不到,为什么呢?因为

没有跟新呢.

当我们跟新之后就可以跑了。

4,通过创建软链接

我们删除之后又不能跑了。

我们来创建一个软链接

就又可以跑了。

 第三,总结

如何制作动态库:


1,都必须先转换为.o 

静态库:gcc -c
动态库:gcc -fPIC -c     //-fPIC生成与位置无关嘛。


2.打包:


静态库:ar -rc 
动态库:gcc -shared -o xxx  


3.使用:


A,给别人的,include(头文件集合) +lib(库文件)
B:  静态库:-i(大写) -L(大写)   -l(小写)
     动态库:-i(大写) -L(大写)   -l(小写

4,代码链接

lyh_linux-test: linux代码练习。 - Gitee.com

相关内容

热门资讯

银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...