当前位置: 首页 > news >正文

【Linux】静态库与共享库

文章目录

  • 一、库

    二、静态库使用方法

    1.生成静态库

    2.静态库使用库

    3.对静态库举例

    三、共享库    

    1.引入共享库

    2.共享库的生成

    3.共享库的使用

    4.注意:共享库需要放在标准路径下

    5.对共享库举例 

    四、共享库和静态库的区别


一、库

库:是一组预先编译好的方法的集合

库的分类:静态库(命名规则:libxxx.a)、共享库/动态库(命名规则:libxxx.so)

二、静态库使用方法

1.生成静态库

  1. 先将所有要生成库文件的.c文件编译为.o文件
  2. 创建静态库,使用ar命令
    1.  ar crv libxx.a xxx.o xxx.o  
    2.  其中,ar:生成静态库,c:创建库,r:将方法添加到库中,v:显示过程

2.静态库使用库

gcc -o main main.c -L. -lxxx

        -L:指明使用库

        -l:指定库名的名称(不需要lib和扩展名.a)

3.对静态库举例

  • 以该main文件为例,内部调用了add和max函数:

  • 如果在编译时,不加add.c和max.c就会报错:

  •  只有加上才能如下图正常编译出来:

  • 此时将max和add函数设为静态库foo使用:

 图示为创建foo.h头文件以及在main函数加入foo.h头文件

  • 按照上述(目录二)步骤对案例进行编译:
  • 生成静态库
    • 先将所有要生成库文件的.c文件编译为.o文件
    • 创建静态库,使用ar命令(ar crv libxx.a xxx.o xxx.o) 
  • 使用库(gcc -o main main.c -L. -lxxx)

 根据上述步骤就可看出编译成功啦~

三、共享库    

1.引入共享库

静态库缺点:当用户同时使用当你同时运行许多应用程序,并且它们都使用来自同一个函数库的函数时,内存中就会有同一函数的多个副本。而且在程序文件自身中也有多份同样的副本,这将消耗大量宝贵的内存和磁盘空间,因此引入共享库

共享库:需要时才调用

2.共享库的生成

  1. 先将所有要生成库文件的.c文件编译为.o文件
  2. 打包生成共享库

                gcc -shared -fPID -o libxxx.so xxx.o xxx.o

3.共享库的使用

        gcc -o main main.c -L. -l库名

4.注意:共享库需要放在标准路径下

        sudo mv libxxx.so  /user/lib

        补充:查看使用了哪些共享库

                ldd main

5.对共享库举例 

  • 生成静态库
    • 先将所有要生成库文件的.c文件编译为.o文件
    • 打包生成共享库(gcc -shared -fPID -o libxxx.so xxx.o xxx.o)
  • 使用库(gcc -o main main.c -L. -lxxx)
  •  上面的运行报错了因为没有将共享库移到标准库内,而系统查找时一般在标准库内,也就是lib位置,没找到,因此会报错,下面移动位置:

 根据上述步骤就可看出编译成功啦~

四、共享库和静态库的区别

        静态库:方法包含到库里面,体积大;
        共享库:方法没有包含进去,只是做了一个标记,体积小;共享库如果10个应用程序共享,那么磁盘上只有一份共享的库文件,而且运行加载时在内存中只加载了标记了的这一份库文件;而静态库,就是这10个应用程序都包含了这个库文件,那么10份的库文件都放在磁盘上了(占用磁盘空间),而且运行加载的时候占用内存空间(10份库文件都要加载);共享库便于升级。

相关文章:

  • POI入门
  • 07- 诊断事件diagnostic events的类图关系
  • 【C#】RestSharp踩坑日记
  • 自学5个月软件测试找到一个8k的工作,我的学习方式值得你借鉴
  • 【JavaEE初阶】文件操作 和 IO (下篇)
  • Nebula Studio:部署与连接
  • Redis 学习笔记
  • 萤火虫(FA)算法(附完整Matlab代码,可直接复制)
  • 01背包完全背包学习记录
  • docker安装redis
  • java毕业设计的婚庆策划系统的设计与实现mybatis+源码+调试部署+系统+数据库+lw
  • Pandas数据分析:处理文本数据(str/object)各类操作+代码一文详解(二)
  • java毕业设计的家居销售网站mybatis+源码+调试部署+系统+数据库+lw
  • 【Linux操作系统】——网络配置与SSH远程
  • 【C++】走进 ⌈ 类和对象 ⌋ 的核心 - 感受C++的精华 _ 剖析默认成员函数 | 构造函数 | 析构函数 | 拷贝构造函数 | 赋值运算符重载
  • python3.6+scrapy+mysql 爬虫实战
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 【5+】跨webview多页面 触发事件(二)
  • 【知识碎片】第三方登录弹窗效果
  • docker python 配置
  • go append函数以及写入
  • Hibernate【inverse和cascade属性】知识要点
  • Java,console输出实时的转向GUI textbox
  • JAVA多线程机制解析-volatilesynchronized
  • js对象的深浅拷贝
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • js正则,这点儿就够用了
  • Laravel 实践之路: 数据库迁移与数据填充
  • Linux快速复制或删除大量小文件
  • vue总结
  • XForms - 更强大的Form
  • 从重复到重用
  • 近期前端发展计划
  • 我是如何设计 Upload 上传组件的
  • 延迟脚本的方式
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • 昨天1024程序员节,我故意写了个死循环~
  • #pragma multi_compile #pragma shader_feature
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (二)Eureka服务搭建,服务注册,服务发现
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (十八)三元表达式和列表解析
  • (一)Neo4j下载安装以及初次使用
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)树状数组
  • .net wcf memory gates checking failed
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET 依赖注入和配置系统
  • .net(C#)中String.Format如何使用
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化