**静态库:**在编译过程中将库函数代码直接加入到生成的可执行程序中,程序运行中不需要利用库函数。
**共享库:**编译时,只是在生成的可执行程序中简单指定需要使用库函数信息,程序运行过程中需要利用库函数。
**动态库:**共享库的一种变化形式,目前大都采用共享库的方式
命名方式:
**静态库:**前缀lib + 库名 +.a(liblzym.a,libstdc++.a等)
**动态库:**前缀lib + 库名 +.so+版本号(libm.so.6,lib.so.6)其实不用写版本号,效果是一样的
一、静态库链接
1.创建静态库
gcc -c 1.c 2.c
目的是生成1.o 2.o文件
ar -cr liblzym.a
(静态库名) 1.o 2.o 目的是生成静态库
2.静态库的使用
gcc -o a main.c -L. liblzym.a
(-o a是取执行文件的名字为a,不加这个就生产a.out;-L. 是查找当前路径下的文件;liblzym.a 是刚才的静态数据库名字)
生成的a.out文件中已经包含了静态数据库
注意:将静态数据库的使用(-l选项)都写在最后
二、动态库链接
1.创建共享库
gcc -c -fPIC 1.c
gcc -c -fPIC 2.c
(这两个生成了 1.o 2.o)
gcc -shared -fPIC -o libtest.so 1.o 2.o
(生成共享库)
2.编译使用共享库的程序
gcc -o test main.c -L. main.c
(生成了test可执行文件)
此时运行test文件会报错,找不到库
共享库系统自动动态加载(执行下面2个方式其一,即可能运行test文件)
1.拷贝动态库文件到/lib/或/usr/lib中
2.改变配置文件/etc/ld.so.conf
1.把库文件复制到/lib/或/usr/lib中(此方式有危险,万一库文件与系统库文件重复,那么系统库文件将会被覆盖,有可能导致系统不可运行)
2. 给etc配置文件
cd /etc
(进入etc)
sudo vi ld.so.conf
(配置文件命令)
进入后 输入动态库的路径
eg:/home/lh/0809
(利用pwd命令可查看当前文件路径)
退出后 sudo ldconfig
(重新启动库)
再ldd test 就发现可以找到库了
扩展:ldd,用于查看库函数之间的依赖性
objddump -d 文件 (反汇编)