zoukankan      html  css  js  c++  java
  • 静态库与动态库的制作和使用

    静态库的制作和使用

    • 命名规则:libtest.a(加粗的地方是格式不可以更改)

      • lib
      • xxx -库的名字(自己取)
      • .a
    • 制作步骤

      • 源代码:.c/.cpp

      • 将.c文件生成.o

        • gcc a.c b.c -c
      • 将.o打包

        • ar rcs 静态库名字 原材料
        • ar rcs libtest.a a.o b.o
        • ar archive(将目标文件打包为静态链接库)
    • 示例

      • 创建三个文件 include文件放置头文件等 lib文件放置静态链接库 src文件放置源代码
      • 在src文件下创建四个.c代码(vi -O add.c div.c mul.c sub.c)
      • 在include文件下创建head.h
      • 在src文件下将.c生成.o (gcc *.c -c -I ../include/)
      • 在src文件下将.o文件打包成静态链接库(生成之后可以用nm命令查看静态库)
      • 在生成的静态链接库复制到lib文件下
      • 补充vim技巧
        • gcc -I(小写的i)寻找头文件的目录
        • vi -O 是垂直分屏,-o是水平分屏;
          qall是同时关闭所有的,wall是同时写入所有的,ctrl + w w(按两次w)可以在不同的窗口切换;
          在非输入情况下,按下两次yy可以复制当前行,按下p可以粘贴到光标当前行。
    • 库的使用

      • gcc main.c -I ./include/ -L ./lib/ -lmycasl -o app
        • -I:指定库的路径
        • -l:指定库的名字,去掉lib和.a
    • 示例

      • 创建主函数将之前封装好的函数调用起来

      • gcc main.c -I ./include/ -L ./lib/ -lmycasl -o app app可以根据需要取名字

        若生成的可执行文件可执行证明静态库制作完毕

    动态库的制作和使用

    • 命名规则
      • libxxx.so(加粗部分为格式要求)
    • 制作步骤
      • 将源文件生成.o文件
        gcc a.c b.c -c **-fpic(fPIC)** -I 头文件路径
      • 打包动态库
        gcc **-shared** a.o b.o -o libxxx.so
    • 库的使用
      • 头文件 a.h
      • 动态库 libxxx.so
      • 参考函数声明编程测试程序main.c
        gcc main.c -I ./头文件路径 -L ./静态库路径 -l xxx -o app
    • 效果

      动态库制作完成,但是会出现无法执行情况

    解决问题

    • 在执行的时候定位共享库文件的流程
      • 当系统加载可执行文件代码的时候,能够知道其所在依赖的库的名字,但是还是需要知道绝对路径,此时就需要系统动态
        加载器(dynamic linker/loader)
      • 对于elf格式的可执行程序,是由ld-linux.so来完成的,它先后搜索elf文件的DT_RPATH段——环境变量LD_LIBRARY_
        PATH——/etc/ld.so.cashe 文件列表——/lib/,/usr/lib目录找到库文件后将其载入内存.
    • 为什么会出现无法执行的情况呢
    • 解决方法
      • 使用环境变量
        • 临时设置:在终端:export LD_LIBRARY_PATH=动态库的路径:$LD_LIBRARY_PATH
        • 永久设置:
          • 用户级别
            • 修改~/.bashrc,加入export LD_LIBRARY_PATH=路径
            • 配置完成重启终端
            • source ~./bashrc
          • 系统级别
            • 修改/etc/profile
            • source /ect/profile
    • 示例

    总结

    • 程序编译一般需经预处理、编译、汇编和链接几个步骤。静态库特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。
    • 静态库在程序的链接阶段被复制到了程序中,和程序运行的时候没有关系
    • 动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。
      使用动态库的优点是系统只需载入一次动态库,不同的程序可以得到内存中相同的动态库的副本,因此节省了很多内存。
  • 相关阅读:
    bzoj4734
    51nod1056
    51nod1048
    51nod1248
    51nod1044
    51nod1132
    51nod1146
    51nod1226
    Spring Boot: Jdbc javax.net.ssl.SSLException: closing inbound before receiving peer's close_notify
    sqlserver命令创建数据库和表 demo
  • 原文地址:https://www.cnblogs.com/kevinkala/p/13909269.html
Copyright © 2011-2022 走看看