目录

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

二, 动静态库的使用

静态库的使用

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

2,方法二,进行指定,

动态库的使用

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

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

3,通过配置文件

4,通过创建软链接

 第三,总结


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

这里我们以makefile统一制作。

ios 静态库打包及使用 静态库打包成动态库_linux

 

ios 静态库打包及使用 静态库打包成动态库_ios 静态库打包及使用_02

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

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

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

ios 静态库打包及使用 静态库打包成动态库_服务器_03

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

二, 动静态库的使用

静态库的使用

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

ios 静态库打包及使用 静态库打包成动态库_服务器_04

 一下是我们的使用方式:

ios 静态库打包及使用 静态库打包成动态库_服务器_05

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

我们找头文件有俩种方式

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

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

ios 静态库打包及使用 静态库打包成动态库_ios 静态库打包及使用_06

那么如何解决呢?

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

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

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

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

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

ios 静态库打包及使用 静态库打包成动态库_算法_07

 

再次头文件拷贝,检查:

ios 静态库打包及使用 静态库打包成动态库_服务器_08

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

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

ios 静态库打包及使用 静态库打包成动态库_算法_09

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

运行也是没有问题的,

ios 静态库打包及使用 静态库打包成动态库_c++_10

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

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

2,方法二,进行指定,

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

ios 静态库打包及使用 静态库打包成动态库_服务器_11

需要三个参数进行指定

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

ios 静态库打包及使用 静态库打包成动态库_c++_12

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

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

ios 静态库打包及使用 静态库打包成动态库_linux_13

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

动态库的使用

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

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

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

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

ios 静态库打包及使用 静态库打包成动态库_c++_14

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

ios 静态库打包及使用 静态库打包成动态库_c++_15

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

我们发现找不到:

ios 静态库打包及使用 静态库打包成动态库_c++_16

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

导入环境变量

ios 静态库打包及使用 静态库打包成动态库_ios 静态库打包及使用_17

检查

ios 静态库打包及使用 静态库打包成动态库_linux_18

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

ios 静态库打包及使用 静态库打包成动态库_ios 静态库打包及使用_19

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

3,通过配置文件

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

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

ios 静态库打包及使用 静态库打包成动态库_linux_20

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

没有跟新呢.

ios 静态库打包及使用 静态库打包成动态库_服务器_21

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

4,通过创建软链接

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

ios 静态库打包及使用 静态库打包成动态库_服务器_22

我们来创建一个软链接

ios 静态库打包及使用 静态库打包成动态库_linux_23

就又可以跑了。

ios 静态库打包及使用 静态库打包成动态库_c++_24

 第三,总结

如何制作动态库:

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