目录
一、库的种类
Linux 下的库有两种:静态库 和 动态库(共享库);
静态库:程序在编译链接的时候把库的代码链接到可执行文件中, .a 为后缀
动态库:程序在运行的时候才去链接动态库(共享库)的代码,可以多个程序共享使用库的代码,通常以.so为后缀;
二、静态库和动态库的优缺点
静态库:把库的代码载入可执行文件中,因此体积较大,当静态库中的内容更新后需要重新编译;由于编译器或链接器知道实际进入程序的代码,可以进行优化,运行速度会快一些;
动态库:只在程序运行时载入内存,因此体积较小,共享库如果发生变化不需要重新编译;运行速度相对慢一些;
三、静态库的创建与使用
1.创建动态库流程:
(1)将代码文件编译成目标文件.o
gcc -c test.c
(2)通过ar工具将目标文件打包成.a静态库文件
ar -crv libMytest.a test.o
ar 是一个专门控制静态库的命令
-c:创建静态库,不管库是否存在
-r 把目录文件合并成一个静态库,如果静态库文件已经存在则更新。-v :使用详细模式
-q 向静态库中添加目录文件
-t 查看静态库中有哪些目标文件
-d 从静态库中删除目标文件
-x 把静态库展开为目标文件
生成静态库libMytest.a ,可以看到后缀是.a
2.使用静态库
共有两种方法,分别如下:
(1)直接调用
把静态库当作目标文件一样
gcc 1.c libMytest.a
(2)通过gcc -L参数来指定库的路径
gcc 1.c -L./ -lMytest
然后运行a.out就可以执行代码
-L:表示要连接的库所在目录
-l:指定库的名称(不需要前面的lib和扩展名.a只留下中间部分)
四、动态库的创建与使用
1.创建动态库
(1)将代码文件编译成目标文件.o ,此时要加编译器选项-fpic
-fPIC 创建与地址无关的编译程序(pic,position independent code),是为了能够在多个应用程序间共享
(2)生成动态库,-shared指定生成动态链接库
生成了动态库libMytest.so,可以看到后缀是.so
以上两行命令也可合成一句
gcc -fPIC -shared -o libMytest.so *.c
2.使用动态库
和上面提到的使用静态库第二种方法一样
gcc 1.c -L./ -lMytest
然后执行a.out的时候我们会发现报错了
原因:链接器ld提示找不到库文件,ld默认的目录是/lib和/usr/lib,如果放在其他路径也可以,需要让ld知道库文件所在的路径
最简单的解决方法就是把动态库拷贝一份到/usr/lib目录中
另一种方法就是添ld知道库文件所在的路径
sudo vim /etc/ld.so.conf
然后添加动态库所在的路径,用pwd查看一下
然后更新一下
sudo ldconfig
这样就可以了
感谢观看!!!!
以上就是全部内容,如果对您有帮助,欢迎点赞评论,或者发现有哪里写错的,欢迎指正!