-
静态库(.a后缀)
(1)生成.o文件(即二进制文件,gcc -c生成)
(2)生成库: ar rcs libCalc.a *.o
(3)查看: nm + 静态库文件.a
(4)使用: gcc -main.c -o app -L lib/ -l Calc (-l指定库名,把lib与后缀去掉) -
动态库(共享库)
(1)与位置无关,即通过偏移量去查找 -fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),运行时加入内存
(2)生成二进制: gcc -fPIC -c *.c -I …/include/
(3)生成库 gcc -shared -o libCalc.so *.o
gcc -shared -fPIC -o 1.so 1.c
这里有一个-fPIC参数
PIC就是position independent code
PIC使.so文件的代码段变为真正意义上的共享
(一) 找不到动态库解决方法:
加入lib(不推荐) ; 环境变量LD_LIBRARY_PATH ;修改/etc/ld.so.conf,添加路径
- 找到xxx.so放到 /usr/lib /lib – 不推荐
o sudo find /usr/local -name “libevent.so” - 将xxx.so放到环境变量中
LD_LIBRARY_PATH
• export LD_LIBRARY_PATH=xxxx
~/.bashrc - - 用户级别
/etc/profile - 系统级别
• 使用命令重新加载
. ~/.bashrc
. /etc/profile
. 等价于 source - 修改/etc/ld.so.conf
o 动态库路径添加到该文件中 - 绝对路径
o sudo ldconfig -v
(二) 动静对比区别
静态库直接加载进入源码即test区速度快,体积大,不需要发布,更新需要重新编译动态库加载共享内存速度没那么快,体积小灵活,一般不用重新编译