1.静态库的制作和使用

1)静态库的后缀名为 .a

2)制作

alt

制作过程如下:

1..首先使用gcc获得 .o 文件

gcc -c add.c div.c mult.c sub.c

2..之后使用 ar 工具将 .o 文件打包

ar rcs libcalc.a add.o div.o mult.o sub.o

以上的操作都是在另一个含有head.h的头文件的文件夹中完成的,因为这些.c文件中都含有head.h,所以必须要在同一文件夹中才能完成,这是我实操中所犯的错误

3..完成之后布局如上图所示,然后就可以直接编译了,只不过与正常的编译相比,我们需要帮助系统去找一些东西

使用命令如下:

gcc main.c -o main -I ./include -l ./calc -L ./lib
// -I是帮助系统找到头文件的路径
// -l是告诉系统静态库的名字
// -L是告诉系统静态库的路径

然后就能直接生成可执行文件,且直接能运行,静态库的制作大致就是这么多的内容

2.动态库的制作和使用

1)动态库本身就是可执行文件,文件后缀名未.so

2)动态库与静态库的不同点是,动态库需要得到和位置无关的代码,需要使用绝对路径来访问

3)制作

1..第一步同样是使用gcc获得 .o 文件,但因为要得到和位置无关的代码,所以我们需要多加一个参数

gcc -c -fpic/-fPIC add.c div.c mult.c sub.c
		//这里的意思是fpic和fPIC中选一个即可 

2..第二步是通过gcc得到动态库

gcc -shared add.o div.o mult.o sub.o  -o libcalc.so

到这里动态库的制作已经完成了

4)使用 动态库的使用相当于是在静态库的使用上多加了一步

1..第一步 这一步与动态库的使用完全一致

gcc main.c -o main -I ./include -l ./calc -L ./lib

2..这样我们同样能得到编译后的文件,但此时,这个文件是不能运行的,运行会报错。

./main: error while loading shared libraries: libcalc.so: cannot open shared object file: No such file or directory

4)我们有好几种办法来解决这个问题

1..法1 直接在终端中配置环境变量

我们可以直接在终端中进行环境变量的配置

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/nowcoder/Linux/lesson06/library/lib
//后面冒号拼接的部分是动态库的绝对路径,可通过pwd命令访问到

但并不推荐这种方式,因为一旦终端关闭,环境就直接失效了,可使用2,3两种方法

2..法2 在nowcoder目录中找到隐藏文件.bashrc,用vim打开,将上面配置环境变量的命令加入保存退出之后,刷新一下即可

source .bashrc
//这是刷新代码

这种方法可实现永久配置

3..法三 系统级别配置环境

sudo vim /etc/profile

输入密码后同样将配置环境变量的命令加入然后刷新一下即可

source .bashrc
//这是刷新代码

4..法四 /etc/ld.so.cash文件列表

这个文件使用的是二进制编码,我们不能直接访问它,但可通过间接访问实现我们的目的

可通过间接访问 /etc/ld.so.conf

sudo vim /etc/ld.so.conf

这种方法我们只需要复制路径即可,不需要配置环境变量

同样我们仍然需要更新一下,更新代码如下:

sudo ldconfig

3.静态库,动态库的区别

区别主要来自于链接阶段如何处理,链接成可执行程序。分别称为静态链接方式和动态链接方式。

4.静态库的优缺点

1)优点

1..静态库被打包到应用程序中加载速度快

2..发布程序无需提供静态库,移植方便

2)缺点

1..消耗系统资源,浪费内存

2..更新,部署,发布麻烦

自己的应用程序也需要编译,比较麻烦

5.动态库的优缺点

1)优点

1..可以实现进程间资源共享(共享库)

2..更新,部署,发布简单

自己的应用程序不需要重新编译,只需要编译库即可

3..可以控制何时加载动态库

2)缺点

1..加载速度比静态库慢

2..发布程序时需要提供依赖的动态库