【1】库的概念
-
库是一种加密的二进制文件
-
库需要被操作系统载入内存中运行,相比于可执行程序,它不可以直接运行
-
window 和 linux 都有自己的库,但是不兼容
-
Linux系统的库有两种 (1) 静态库 {*.a} (2) 共享库(又叫动态库) {*.so}
【2】静态库的制作和使用
优点:a.out 运行后不需要库,可以直接运行
缺点: 每个a.out都要包含库,体积较大, 浪费资源; 对程序更新,部署,发布带来麻烦;
-
制作: $ gcc -c xxx.c -o xxx.o $ ar -crs libxxx.a xxx.o
-
静态库的命名规范: 必须以lib开头,紧跟库的名字,跟扩展名 .a 例如: libxxx.a
-
使用 $ gcc main.c -L(路径) -lxxx -L: 指定静态库所在的目录 -l: 指定静态库的名字
-
运行 $ ./a.out (7200)
【3】动态库的制作和使用
-
制作 :$ gcc -fPIC -c xxx.c -o xxx.o $ gcc -shared -o libxxx.so xxx.o
-
动态库的命名规范: 必须以lib开头,紧跟库的名字,跟扩展名 .so 例如: libxxx.so
-
使用: $ gcc main.c -L路径 -lxxx $ ldd a.out 用于查看可执行程序依赖的动态库有哪些
-
运行 $ ./a.out # 会报错 (7146)
动态库的搜索方式(3种,任意选一种):
-
将动态库拷贝到 /lib/ 或者 /usr/lib/ 例:$ sudo cp libxxx.so /usr/lib/
-
export LD_LIBRARY_PATH=.或者so所在的路径 (临时情况)
-
(1)pwd (2)cd /etc/ld.so.conf.d (3)ls (4)sudo vi my.conf (5)添加路径 (6)sudo ldconfig 生效
-
特点:在编译时不会链接到可执行文件中,只是再其中保存一个索引,在运行时,才真正的链接(动态),因此可执行程序体积小。
优点: a.out 体积较小, 节约资源; 只需要修改.so动态库,有利于程序的更新,部署,发布;
缺点:a.out 运行后需要库,不能直接运行。