静态与动态链接库

  1. 【静态与动态链接库】静态库(.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与后缀去掉)
  2. 动态库(共享库)
    (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,添加路径
  1. 找到xxx.so放到 /usr/lib /lib – 不推荐
    o sudo find /usr/local -name “libevent.so”
  2. 将xxx.so放到环境变量中
    LD_LIBRARY_PATH
    ? export LD_LIBRARY_PATH=xxxx
    ? ~/.bashrc - - 用户级别
    ? /etc/profile - 系统级别
    ? 使用命令重新加载
    ? . ~/.bashrc
    ? . /etc/profile
    ? . 等价于 source
  3. 修改/etc/ld.so.conf
    o 动态库路径添加到该文件中 - 绝对路径
    o sudo ldconfig -v
(二) 动静对比区别
静态库直接加载进入源码即test区速度快,体积大,不需要发布,更新需要重新编译动态库加载共享内存速度没那么快,体积小灵活,一般不用重新编译

    推荐阅读