linux下动静态库的制作,打包,以及模拟第三方库使用

  • Post author:
  • Post category:linux



目录


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


二, 动静态库的使用


静态库的使用


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



版权声明:本文为weixin_50374599原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。