目录
文章中索要的代码文件点击文章顶部下载
一、静态库的制作
图1 静态库的命名规则和制作流程
1.准备文件
准备一些测试文件.c结尾,并在一个头文件中以api调用
如图,分别有add.c,div.c,mult.c,sub.c,再再head.c中调用,并在main.c中运行
2.gcc获得.o文件
将add.c,div.c,mult.c,sub.c文件用gcc编译,但是不运行获得.o结尾的文件,如下
gcc -c add.c div.c mult.c sub.c
3.将.o文件打包
ar rcs libstatic.a *.o
lib是固定前缀,后面是名字,.a为文件后缀,*是通配符,为可以写出每个文件
获得的所有文件
二、静态库的使用
1.文件放置
将文件包含的头文件include(包含head.h),src(包括上面的几个接口函数),还有lib(包括生成的静态库libstatic.a,放到一个文件夹)
2.文件编译
gcc main.c -o main -I ./include -l static -L./lib
解释一下,-I (第一个大写I)是指头文件路径,第二个-l(小写L)指需要那个静态库,后面-L静态库路径,前面两个-l看起来一样,其实不是一个哈 。
再运行一下就ok
三、动态库制作
1.文件准备
同样需要文件,和静态库一样,这里就不再赘述
2.得到.o结尾的文件
gcc -c -fpic add.c div.c mult.c sub.c
-fpic是生成和路径无关的文件,必须要加上
3.gcc获得动态库
gcc -shared *.o -o libdynamic.so
四、动态库的使用
1.文件放置
和静态库一样
2.文件编译
gcc main.c -o main -I include -l dynamic -L lib
具体解释和静态库一样
此时生成了可执行文件main
运行一下试试 ./main ,发现报错了
./main: error while loading shared libraries: libdynamic.so: cannot open shared object file: No such file or directory
这个错误原因是找不到可执行文件,解决这个错误在第五节中
五、解决动态库加载失败问题
执行ldd命令发现动态库路径找不到,第三行
有三种解决方法,但只推荐其中两种
1:设置环境变量LD_LIBRARY_PATH
(1).设置环境变量LD_LIBRARY_PATH的值
直接在终端运行以下命令:
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/china/Linux/liaxi/dynamic/library/lib
export添加路径,$读取原有的值,:拼接上要加载的动态库路径,再使用ldd查看程序动态库路径是否添加成功,
但是该方法是临时的,因为在终端中配置,退出终端后,再次运行程序又会出错。
(2)用户级永久配置
首先执行cd 进入家目录,然后进入.bashrc文件,将
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/china/Linux/liaxi/dynamic/library/lib
添加到最后一行,最后执行. .bashrc 或者source .bashrc保存更改
(3)系统及永久配置
sudo vim /etc/profile 在最后一行加入:
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/china/Linux/liaxi/dynamic/library/lib
然后保存更改:source /etc/profile
注意:如果通过用户级或者其他配置配置后再进行系统配置会出现多个一样的配置,此时,重新连接新窗口,关闭打开的其他所有窗口,再次进入即可
通过echo读取LD_LIBRARY_PATH的值:echo $LD_LIBRARY_PATH
路径正确
2:修改/etc/ld.so.cache
因为不能直接修改/etc/ld.so.cache,所以间接修改/etc/ld.so.conf文件
要通过sudo vim /etc/ld.so.conf,进入目录,最后一行加入LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/china/Linux/liaxi/dynamic/library/lib路径,再执行sudo ldconfig保存修改。
还有一种方式是修改/lib/,或者/usr/lib,但是不建议
使用上面有几种当中的任意一种即可,此时再查看一下运行情况:./main
程序正确运行
六、整体流程
1.静态库制作和使用
2.动态库制作和使用
3.解决动态库加载失败问题
只展示了第一个中的1,2两种方法,其他都是一样的