静态库与动态库

偶尔善良 提交于 2020-03-23 13:44:02

gcc工作流程和编译原理

  1. 预处理 gcc -E
  2. 编译 gcc -S
  3. 汇编 gcc -c
  4. 链接 没参数

gcc的参数

  -I 指定头文件的路径
  -o 指定生成的文件名
  -D 在编译的时候给代码定义宏
  -O 优化程序 后面跟 0 1 2 3 这是优化等级
  -Wall 在程序编译的时候提示警告信息 比如定义了变量没有使用
  -g 在程序中添加调试信息
  -c 只编译子程序
  -L 指定所用的库的目录
  -l 指定库的名字 掐头去尾

静态库的制作

  1>.命名规则

    lib + 库的名字 + .a 例如 libmytest.a

  2>.制作步骤

    1). 生成对应的.o文件 --------- .c --->.o -c
    2). 将生成的.o文件打包 ar rcs + 静态库的名字(libmytest.a)+ 生成的所有的.o

  3>.发布和使用静态库:

    1). 发布静态库
    2). 头文件

  4>.静态库的优缺点:(由于库在编译的时候直接被打包到应用程序中,所以会有对应的优缺点)

    优点:
      1).发布程序的时候,不需要提供对应的库
      2).加载库的速度快
    缺点:
      1).库被打包到应用程序中,导致应用程序的体积很大
      2).库一旦发生了改变,应用程序都需要重新编译

动态库(共享库)的制作和使用:

1>.命名规则:

  1). lib + 名字 + .so

2>.制作步骤:

  1). 生成与位置无关的代码(生成与位置无关的.o) gcc -fPIC -c *.c 多个参数-fPIC
  2). 将.o打包成共享库(动态库)

3>.发布和使用共享库

4>. 解决程序执行时动态库无法被加载的问题:

  1)放到系统的库目录中 --- 不允许使用
  2) 临时测试 (终端关闭后就会失效)
    环境变量: LD_LIBRAREY_PATH 将动态库的路径设置给该变量
    将设置的值,导入到系统环境变量中: export LD_LIBRARY_PATH
  3) 不常用的方法(永久设置):
    在家目录的.bashrc文件中添加一句话: export LD_LIBRATRY_PATH=动态库目录的绝对路径
    .bashrc修改完成,需要重启终端
  4)
    1. 需要找到动态连接器的配置文件 -- /etc/ld.so.conf
    2. 动态库的路径写到配置文件中(绝对路径)
    3. 更新 --- sudo ldconfig -v

5>. 动态库的优缺点

  优点
    1. 执行程序体积小
    2. 动态库如果更新了 不需要重新编译程序 (函数接口不变)
  缺点:
    1.发布程序的时候,需要将动态库提供给用户
    2.动态库没有被打包到应用程序中,所以调用起来相对较慢一些

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!