一.静态库
静态库格式为libxxx.a,中间是库名称,它的制作需要两步:
将c源文件编译为二进制.o文件, gcc -c test.c 生成test.o
将test.o文件生成libtest.a文件, ar rcs libtest.a test.o
主要第二步容易忘,需要经常记忆
二.静态库使用
假设你的项目目录如下,你要编译main.c:
gcc main.c -o main -I ./include -l calc -L ./lib
其中的参数在上篇gcc 编译可选项中讲过,-o是生成自己想要的名字,-I(大i)是找到自己的头文件目录,因为静态库制作并不包含头文件信息,-l(小L)加的是自己刚制作的静态库名称,-L是自己静态库的目录,便于找到该库。
其实这几个参数和它目录是一致的,便于记忆。
三. 动态库制作
静态库是在链接阶段打包到可执行文件中的,加载速度快,而动态库是独立于可执行文件的,它运行在ram随机存储内存中。
开多个相同程序时肯定动态库方便,因为它是共享的。
静态库部署更新发布麻烦
库较小使用静态,库较大使用动态
动态库制作也要两步
第一步生成二进制.o文件, gcc -c -fpic test.c
-fpic参数在上篇有记录,它将生成与位置无关的代码
第二步生成动态库.so文件 gcc -shared test.o -o libtest.so
其中第二步和静态库ar指令制作不同,动态库依然使用gcc编译
四.动态库使用
动态库使用和静态库一致,也需要头文件目录,库文件名称及目录。
但是动态库在链接时只有简要信息,生成的可执行文件并不包含动态库代码,所以需要加入到环境变量中,供系统调用。
加入到终端窗口LD_LIBRARY_PATH中(临时添加,关掉窗口即消失)
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ikun/course01/lib
使用echo $LD_LIBRARY_PATH查看是否添加成功
用户级别,添加到用户.bashrc文件中
cd
切换到用户目录下即/home/ikun
ll或者ls -a
列出当前所有文件,包括隐藏的配置文件.bashrc
gedit .bashrc
打开.bashrc 文件,当然你也可以用vim
在最后一行添加
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ikun/course01/lib
保存退出
source .bashrc使配置生效
系统级别(root权限)
在/etc/profile 文件中,和第二种方式一致
修改/etc/ld.so.cache
我们要修改/etc/ld.so.conf文件,直接加入库文件路径即可
sudo ldconfig更新即可
不建议将库文件放置在/lib或者/usr/lib中,因为里面有一些系统的库文件
总结:用户级别就用2,系统级别就用3或4