9.5 Linux_I/O_静态库与动态库

news2024/11/17 3:30:08

什么是库:

库是一个二进制文件,包含的代码可用被程序调用。常见的库有标准C库、数学库、线程库。

调用库的方式有两种:

  • 使用库的源码,下载后编译
  • 直接安装库的二进制包

在Linux下,库存放在/lib 和 /usr/lib 目录下

静态库与动态库的区别:

  • 静态库 .a:

静态库会在链接时将静态库中的相关代码复制到可执行文件中,即:可执行文件中包含了静态库,只需要这个可执行文件即可运行程序。

使用静态库生成的可执行文件,运行时不需要加载库(因为本身就包含了静态库的内容),运行速度更快。但因为每一个可执行文件中都复制了静态库的内容,所以会占用更多的磁盘和内存空间

从上述描述中可以看到,可执行文件中的静态库是写死的,这代表静态库升级后,程序需要重新编译链接才可将升级后的静态库写入到可执行文件中

  • 动态库(共享库).so :

动态库在链接时仅仅将库中的符号复制到可执行文件中,即:可执行文件中只包含了链接,没有库本身,库和可执行文件都存在时,程序才可执行。

使用动态库生成的可执行文件,运行时需要加载库。因为可执行文件中不包含库源码,所以占用的空间少,库升级时也不用重新编译,同时多个程序也可以共享一个库

使用静态库步骤

简易的步骤如下:

  1. 编写库源码,使用.o文件生成静态库.a
  2. 编写应用程序源码,编译时链接静态库

具体实现步骤如下:

1.1 创建.c文件,编写相关的函数实体。这里以简单的编写一个hello world为例。

1.2 将.c文件进行编译汇编。gcc -c hello.c -o hello.o

1.3 将.o文件生成静态库。ar -rsv libhello.a hello.o

具体ar命令使用、命名规则在补充章节。

1.4 查看静态库有哪个文件生成。ar -tv libhello.a

2.1 编写应用源码。这里就简单使用以下库里面的hello函数。

2.2 在编译汇编test.c时链接静态库。gcc test.c -L . -l hello -o test

这代表编译test.c是,在当前路径下寻找库(-L),库的名称为hello(-l),生成的可执行文件为test

注意:当2.2步骤完成后,可执行程序test中已经包含了静态库hello的全部代码,这时将可执行程序test或静态库hello随意移动,都不会产生影响,即:test与hello是两个独立的个体。

使用动态库步骤

简易的步骤如下:

 

具体实现步骤如下:

1.1 创建.c文件,编写相关的函数实体。这里以简单的编写一个hello world为例。

1.2 将.c文件进行编译汇编。gcc -c -fPIC hello.c -o hello.o

1.3 将.o文件生成动态库。gcc -shared hello.o -o libhello.so

 2.1 编写应用源码。这里就简单使用以下库里面的hello函数。

2.2 在编译汇编test.c时链接静态库。gcc test.c -L . -l hello -o test

2.3 添加共享库的加载路径

方式1:将动态库libhello.so拷贝到/usr/lib 或 /lib目录下

这种方式不推荐,因为会把这两个目录搞的很乱。

方式2:在环境变量LD_LIBRARY_PATH中添加库所在路径,并将这个变量加入启动脚本中。

打开启动脚本:vi ~/.bashrc

执行启动脚本:source ~/.bashrc

补充

1、创建静态库命令 ar

参数含义:

  • c:禁止在创建库产生正常的信息,即:只打印错误信息
  • r:如果指定的文件已经存在于库中,则替换它
  • s:强制重新生成库符号表
  • v:打印建立新库的文件描述
  • q:将指定的文件添加到库的末尾
  • t:打印库的目录,即:查看静态库有哪个文件生成

静态库名称命名规则:

以lib开头,后面为库名,静态库以.a结尾。比如 libhello.a 这代表名为hello的静态库。

2、查看库中的符号表 nm

nm <.o文件>  查看库中的符号表

3、查看文件使用的动态库 ldd

ldd <可执行文件>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2170737.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AWS Network Firewall -NAT网关配置只应许白名单域名出入站

1. 创建防火墙 选择防火墙的归属子网(选择公有子网) 2. 创建规则白名单域名放行 3. 绑定相关规则

探讨TikTok直播专线的必要性

随着社交媒体的迅速发展&#xff0c;短视频平台如TikTok&#xff08;在中国抖音&#xff09;已成为现代人生活中不可或缺的一部分。TikTok的直播功能因其即时性和互动性受到广泛喜爱&#xff0c;但在中国市场上&#xff0c;主播们在使用这一功能时面临不少挑战&#xff0c;其中…

O2OA(翱途)服务器故障排查

O2OA&#xff08;翱途&#xff09;开发平台针对o2server服务器在运行过程中出现的无响应或响应缓慢的问题&#xff0c;我们可以从多个不同方向进行深入而系统的排查&#xff0c;以确保能够准确识别并解决根本原因。 应用服务器日志 对于o2server服务器我们首要排查的是服务器…

基于大数据+大屏可视化+协同过滤算法的经济型酒店推荐系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

【AI驱动 TDSQL-C Serverless 数据库技术实战营】AI赋能电商数据管理

随着大数据时代的到来&#xff0c;数据量的激增对数据库系统提出了更高的要求。传统的数据库管理方式已经难以满足现代企业对于灵活性、可扩展性以及成本控制的需求。在此背景下&#xff0c;Serverless架构因其按需分配资源、自动扩展等特性而受到广泛关注。本文将探讨如何利用…

高效免费!PDF秒变Word,在线免费转换工具推荐!!!

#创作灵感# 工作中&#xff0c;总是需要将pdf文件转换成word文件&#xff0c;便于后期编辑、处理、使用&#xff0c;但是又没有wps会员&#xff0c;虽然去淘宝买&#xff0c;一天也就8毛钱左右&#xff0c;但是转换文件的工作几乎每天都需要做&#xff0c;长此以往&#xff0c;…

Java零工市场小程序如何实现一站式服务

零工市场小程序作为一个为自由职业者服务的平台&#xff0c;Java编程语言是其坚实的后盾&#xff0c;为自由职业者提供了良好的服务&#xff0c;提高了用户体验感和工作效率&#xff0c;实现了一站式服务。 首先&#xff0c;用户只需在微信中就可使用&#xff0c;注册完善个人信…

GPIO模拟输出PWM调节屏幕背光亮度

一、概述 很多时候由于节省硬件资源&#xff0c;降低成本&#xff0c;会把PWM控制芯片去掉或者是改做它用&#xff0c;导致当我们想用PWM方式控制背光时只能使用普通的GPIO口。本篇文档就来讲解下如何使用GPIO模拟PWM功能进行背光的控制。本文以IMX6为例。 二、确认硬件接口 …

LLM如何结合知识图谱进行RAG

从RAG到GraphRAG&#xff1a;知识图谱如何提升大模型的检索与推理能力&#xff1f; ©作者|Zane 来源|神州问学 为什么需要知识图谱 在20世纪60年代末&#xff0c;数据库技术开始发展&#xff0c;在70年代数据库技术得到了迅猛的发展&#xff0c;成为了计算机科学的一个重…

Spring Boot 学习之路 -- 处理 HTTP 请求

前言 最近因为业务需要&#xff0c;被拉去研究后端的项目&#xff0c;代码框架基于 Spring Boot&#xff0c;对我来说完全小白&#xff0c;需要重新学习研究…出于个人习惯&#xff0c;会以 Blog 文章的方式做一些记录&#xff0c;文章内容基本来源于「 Spring Boot 从入门到精…

终于弄明白了!ChatGPT原理大白话解析,看这一篇就够了

我们熟知&#xff0c;ChatGPT能聊天画图&#xff0c;能编程啃论文&#xff0c;那么&#xff0c;这个聊天机器人到底是怎么学会与人类交流的呢&#xff1f; 经过这段时间的琢磨方神倾情板书输出讲解回头翻阅各种资料&#xff0c;也终于明白了个大概&#xff0c;在这尽量给大家用…

大直径海油输油管测径仪的技术特点

关键字:海油输油管测径仪,输油管测径仪,海油管道测径仪,非接触测径仪,大直径测径仪, 大直径海油输油管测径仪的精度是确保海油管道直径测量准确性的关键因素&#xff0c;对于保障油气的顺畅传输与安全稳定具有重要意义。 大直径海油输油管测径仪的精度通常可以达到非常高的水平…

【算法系列-数组】移除元素 (双指针)

【算法系列-数组】移除元素 (双指针) 文章目录 【算法系列-数组】移除元素 (双指针)1. 算法分析&#x1f6f8;2. 删除有序数组中的重复性(LeetCode 26)2.1 解题思路&#x1f3af;2.2 解题过程&#x1f3ac;2.3 代码举例&#x1f330; 3. 移动零(LeetCode 283)3.1 解题思路&…

【java数据结构】泛型

【java数据结构】泛型 一、包装类1.1 基本数据类型对应的包装类1.2 装箱和拆箱 二、泛型2.1 引出泛型2.2 什么是泛型2.3 语法2.3.1 泛型类2.3.2 泛型接口2.3.3 泛型方法 2.4 擦除机制2.5 泛型通配符2.5.1 <?>无限定的通配符2.5.2 <? extends T>上界的通配符2.5.3…

【算法篇】二叉树类(2)(笔记)

目录 一、Leetcode 题目 1. 左叶子之和 &#xff08;1&#xff09;迭代法 &#xff08;2&#xff09;递归法 2. 找树左下角的值 &#xff08;1&#xff09;广度优先算法 &#xff08;2&#xff09;递归法 3. 路径总和 &#xff08;1&#xff09;递归法 &#xff08;2…

移动端自适应/适配方案【详解】(含多种方案对比,推荐 viewport 方案,postcss-px-to-viewport-8-plugin 的使用等)

为什么移动端需要自适应/适配 &#xff1f; 因移动端 屏幕尺寸不同屏幕分辨率不同横竖屏 移动端自适应/适配方案 【必要】设置 meta 标签 <meta name"viewport" content"widthdevice-width, initial-scale1.0, maximum-scale1.0, user-scalable0">…

N930X音乐芯片,声光报警器语音方案:“您已进入警戒区域”

随着科技的飞速发展&#xff0c;城市规模不断扩大&#xff0c;人口密集度显著增加&#xff0c;各类安全隐患也随之而来。从商业楼宇到居民小区&#xff0c;从工业园区到交通枢纽&#xff0c;每一个角落都需要高效、可靠的安防系统来守护人们的生命财产安全。 声光报警器&#…

【ADC】SAR 型 ADC 和 ΔΣ ADC 的噪声源以及输入信号驱动和电压基准驱动电路

本文学习于TI 高精度实验室课程&#xff0c;简要介绍 SAR 型 ADC 和 ΔΣ ADC 的输入信号驱动和电压基准驱动电路&#xff0c;并介绍 SAR 和 Delta-Sigma 转换器的内在和外在噪声源。 文章目录 一、ADC 的外部噪声1.1 50/60 Hz 工频干扰1.2 混叠与抗混叠滤波器1.3 射频&#xf…

博主回归!数据结构篇启动

目录 1>>闲话 2>>数据结构前言 3>>复杂度的概念 4>>时间复杂度 5>>大O渐进表示法 6>>总结 1>>闲话 家人们好久不见&#xff0c;小编军训终于是结束了&#xff0c;大一事情太多了&#xff0c;这几天没时间健身&#xff0c;没时间…

WT2605C蓝牙语音芯片智能对话模型 人机互动 让机械设备更智能

随着人工智能技术的飞速发展&#xff0c;AI语音芯片在机械设备领域的应用日益广泛。WT2605C作为一款集成了在线TTS&#xff08;Text-To-Speech&#xff0c;文本到语音&#xff09;功能的蓝牙语音芯片&#xff0c;凭借其卓越的性能和广泛的应用前景&#xff0c;为机械设备产品带…