动态库的命名规则:
lib + 库的名字 + .so
动态库的制作步骤:
1. 生成与位置无关的.o, gcc -fPIC -c *.c(所谓与位置无关相对静态库而言,静态库参与编译是放到代码段中参与编译,而动态库编译是只是动态库表示的符号参与编译,真正加载是在程序运行时,加载时的地址空间是根据函数调用的地址来决定的,不固定)
2. 将所有.o打包成.so, gcc -shared -o libMySum.so *.o
动态库的使用:
以调用库libMySum.so为例
1. gcc main.c lib/libMySum.so
2. gcc main.c -L lib -l MySum
找不到连接的动态库解决方法:
1. 将动态库文件放到系统的lib下
2. 将动态库文件的路径指定到LD_LIBRARY_PATH中,如export LD_LIBRARY_PATH=./lib[临时方案,关闭终端失效]
3. 修改配置文件,添加export LD_LIBRARY_PATH=/home/yc/linux-base/day03/lib到~/.bashrc最后,每次终端开启都会读该配置文件
4. Step1.找到动态连接器的配置文件(/etc/ld.so.conf) Step2.动态库的配置文件写到配置文件中(添加库的绝对路径到文件末尾) Step3.更新配置文件(sudo ldconfig -v)
动态库的优缺点:
优点1:执行程序体积小
优点2:动态库更新不需要重新编译程序(前提是接口没有变化)
缺点1:发布时需要把动态库文件提供给用户
缺点2:运行时加载,相对静态库来说加载速度较慢
注意点:
ldd:查看应用程序执行时依赖的所有的动态库