静态库和动态库的制作

3. 静态库的制作
  1>. 命名规则
    1). lib + 库的名字 + .a
    2). libmytest.a
  2>. 制作步骤:
    1). 生成对应的.o文件 -- .c --> .o   -c : gcc -c *.c    -I ../include
    2). 将生成的.o文件打包成静态库         :  ar rcs + 静态库的名字(libMytest.a) + 生成的所有的.o   ,生成.a文件后mv到lib目录下
        ar rcs libmytest.a a.o b.o c.o
        (就是一个打包.o文件的过程)
        ar 工具不包含在gcc中
        r --> 将文件插入静态库中
        c --> 创建静态库,不管库是否存在
        s --> 写入一个目标文件索引到库中,或者更新一个存在的目标文件索引。
  3>. 发布和使用静态库:
    1). 发布静态库
    2). 头文件
    
      3.1 使用:两种方法
    写一个main.c文件测试程序。
    a)编译文件:gcc  main.c ../lib/libmyapp.a   -o myapp   -I ../include/
              gcc + 需要打包的文件和静态文件  + 目标文件   + 用到的目录
    b)gcc main.c -I include  -L lib -l myapp    -o myapp
      gcc + 源文件 +头文件+ 静态库+指定库名(libmyapp.a去掉lib和.a) +目标文件
      
    
  4>. 优缺点:
   1)优点:a 发布程序时,不需要提供对应的库   b 加载库的速度快
   2)缺点:a 库被打包到应用程序中,导致库的体积大  b 如果库发生改变,需要重新编译程序,升级较麻烦
  
4. 共享库的制作:共享库也叫动态库
  1>. 命名规则:
    1). lib + 名字 + .so
  2>. 制作步骤:
    1). 生成与位置无关的代码 (生成与位置无关的.o)   :gcc -fPIC  -c *.c   -I ../include
    2). 将.o打包成共享库(动态库)                    :gcc -shared -o libmytest.so  *.o  -Iinclude  。生成的.so文件mv到lib目录下。
  3>. 发布和使用共享库:
    生成可执行程序:
    1 gcc  main.c  lib/libmytest.so  -o myapp  -Iinclude
    2 gcc  main.c -I include -L lib  -l mytest -o myapp
  
  4>. 解决程序执行时运行失败,查看依赖的共享库:ldd myapp 发现 libmytest 找不到
   原因是没有给动态链接器(ld-linux.so.2)指定好动态库 libmytest.so 的路径。
   解决方案:第四种常用
    1). 放到系统的库目录 中 /lib/-- 不允许使用  
    2). 临时测试: export LD_LIBRARY_PATH=目录
       环境变量: LD_LIBRARY_PATH=将动态库的路径设置给该变量
       将设置的值, 导入到系统环境变量中: export
       当终端关闭, 设置会失效
    3). 不常用的方法(永久设置): .bashrc
       在家目录的 .bashrc文件 中添加一句话: export LD_LIBRARY_PATH=动态库目录的绝对路径
       .bashrc修改完成, 需要重启终端
    4). 
     1. 需要找动态连接器的配置文件 --  /etc/ld.so.conf
     2. 动态库的路径写到配置文件中 -- 绝对路径
     3. 更新 -- sudo ldconfig -v
     
     tar zxvf
     tar jcvf
  5>. 优缺点:
   优点:
   1动态库在程序执行过程中才会被加载到内存中,执行程序体积小
   2如果动态库更新,不需要重新编译程序,(前提接口不能变)
   缺点:
   1 发布程序时需要把动态库提供给用户
   2 动态库没有被打包到应用程序中,加载速度相对静态库慢
  
  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值