一.动静态库的区别
动态库是程序运行时再去链接库的代码,多个程序共享库的一份代码,静态库是程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。所以动态库的体积要小于静态库。
二.如何创建静态库
首先创建静态库我们需要.h文件和对应的实现,这里我们以math和add为例。
首先我们需要先生成.o文件。
我们可以用这句命令来打包上文中的两个.o文件,注意生成的.a文件必须以lib开头
而这个.a文件就是我们要生成的静态库。
我们可以通过makefile来自动化生成库的过程。
到此静态库就已经生成完毕了。我们可以顺手写一个发布版本。
这样就能吧头文件和库文件打包好提供了。
三.如何使用静态库
一共有二种使用方法
第一种就是直接把静态库拷贝到系统路径(不推荐,毕竟更改了系统原本的内容)
就是把include/内部所有文件拷贝到user/include,再把lib/内部的所有文件拷贝到/lib64
最后在编译的时候告诉链接哪个库就可以,比如说这样
gcc -c main.c -lmath
就能编译通过了。
第二种就是直接使用(也是常用)
也就是显性的告诉编译去哪里搜寻头文件和库文件(最后必须声明使用哪个库)
两个参数i 和 l都是大写。
这行命令可以看成四段
首先是正常编译命令,然后是头文件的路径,再是库文件的路径,最后是使用了那些库文件,就是l加上之前的.a文件去掉lib的名字。
四.如何生成动态库
同样我们需要生成.o文件但由于是动态库,所以的.o文件应该和路径无关.所以我们在生成.o文件时应该加上选项 -fPIC 。
最后在生成动态库的时候要带上 -shared,因为是共享的库文件。同样库文件要以lib开头动态库的形式上.so。
五如何使用动态库
我们可以通过上文使用静态库的第二种方法来先试着使用以下动态库,可以看到成功创建出可执行文件。
但是当前的程序是无法执行的。 这里简单说一下,因为动态库是可以分批加载的,此时虽然程序形成了但库还没有加载,虽然我们已经告知了gcc 库的位置,但此时程序已创建完了,是系统不知道该去里加载库。所以我们只需要让系统知道去哪里寻找这个动态库就可以,接下来有多种方法解决这个问题
(一)配置库加载时的搜索路径(不推荐)
首先我们需要找到我们动态库的绝对路径
这是我当前去掉前缀的路径,我们需要把这个路径添加到系统原有的搜索路径中
把我们的绝对路径接到这行命令后面,这样就修改成功了,可以通过echo看一下
这样就修改成功了。但这个方法每次关闭xshell就需要从新配置。
(二)修改配置文件
我们需要在这个文件夹内新增我们自己的配置文件,并把我们的库路径放入咱们的配置文件中
比如这个test.conf就是我们新建的配置文件,名字叫什么都可以,接下来把库的绝对路径放入这个文件就可以了 。
最后通过这句命令加载一下配置文件,这样就可以正常使用我们的程序了,且不用每次登陆重新配置。
六.细节
当静态库和动态库同时存在的时候默认使用动态库。也可以通过在编译的时候加上- static来把动态库强制作为静态库来使用。