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

Linux动静态库

Linux动静态库

1.动静态库介绍

在程序翻译的链接阶段,其实就是把一堆.o文件链接在一起形成.exe文件。如果一个程序中需要链接很多个.o文件,那么这些.o文件就需要被打包才方便管理,**库文件本质就是把.o文件打包。**库文件是一种提高开发效率的手段。

库有动态库和静态库之分,不同的操作系统的动静态库后缀也不同:

动态库静态库
Linux.so.a
Windows.dll.lib

对于静态库,使用静态库形成可执行程序后,静态库被加载到了可执行程序的代码里,不需要让系统知道静态库在哪里;但对于动态库,由于动态库不加载到可执行程序里,而是动态加载到内存中,所以使用动态库要告诉系统动态库在哪(因为是系统来加载动态库)。

动态库在编译时代码不会被复制到可执行文件中,而是在运行时由操作系统动态加载到内存中。而静态库在编译时代码会被完整地复制并链接到可执行文件中。使用动态库的可执行程序共用同一个库,而使用静态库的可执行程序中都单独有静态库的拷贝。

链接:

我们的程序需要与某些库结合才能执行,与库结合的过程就是链接。每个语言都要有自己的标准库,在安装开发环境的时候就需要安装语言的标准库和头文件。

2. 动静态库的优缺点

2.1 动态库

优点:

1.更加节省内存并减少页面交换。

2.库文件与程序文件独立,只要输出接口不变,更换库文件不会对程序文件造成任何影响,因而极大地提高了可维护性和可扩展性。

3.不同编程语言编写的程序只要按照函数调用约定就可以调用同一个库函数。

4.适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试。

缺点:

1.运行时依赖,否则找不到库文件就会运行失败。

2.运行加载速度相较静态库慢一些。

3.需要对库版本之间的兼容性做出更多处理。

2.2 静态库

静态库

优点:

1.运行加载速度块。

2.使用静态库的可执行程序一旦形成,就与库无关。

缺点:

1.有多少个程序依赖静态库,静态库在代码中就有多少份拷贝,造成资源浪费。

2.修改静态库代码后,需要重新形成所有依赖这个库的可执行程序,造成时间浪费。

2. gcc链接第三方库的方法

gcc/g++需要知道库的路径才能找到库,如果不把第三方库安装到系统的库目录里,gcc/g++就需要有头文件和库的所在目录路径才能找到找到第三方库,其中头文件只需要传它们所在的目录即可,但库文件除了给出目录的路径还需要给出库的具体名字,且要删去lib.a只保留中间的部分。

gcc链接第三方库的选项:

gcc [file] -I [头文件路径] -L [库文件路径] -l [库文件名] -I表示指定用户自定义头文件路径 -L表示用户自定义库文件路径 -l表示执行确定的第三方库名称

#inlcude<>中的<>表示在系统的库目录中查找。实际上代码文件中的#inlcude<>中就已经给出了头文件的具体名字,所以不用在gcc的时候加上头文件的名字。如果将<>替换成"",且里面的内容不是头文件的名字,而是头文件的路径加名字那么gcc的时候甚至可以不写头文件的路径。

链接静态库:

gcc默认链接动态库,如果gcc没有-static选项,且只提供.a,那么就会静态链接.a库,其他库正常动态链接;如果有-staitc选项,它表示链接的所有库都必须提供对应的静态库,否则报错。

3. 让系统找到第三方库的方法

3.1 把库安装到系统

所有的系统动态库都在lib64目录下存储,解决系统找不到动态库的一个办法就是把第三方库拷贝到该目录下,且系统与该目录的动态库是松耦合关系,只要动态库在目录里就能直接被找到。

3.2 软链接法

一般不推荐把第三方库直接安装到lib64目录下,但是可以在lib64目录里建立一个第三方库的软链接,这种方法在实践中也常用到。

3.3 设置环境变量法

可以通过LD_LIBRARY_PATH设置临时环境变量,让系统在找寻库的时候在特定的路径下查找,添加环境变量的方式为:

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:[库路径]

该环境变量在每次系统登陆时都会刷新,不能永久保存。

如果想永久保存设置的环境变量,可以修改.barshrc环境变量配置文件,让环境变量永久生效。

3.4 设置conf

最推荐的方式是设置新增动态库搜索的配置文件

先以管理员权限进入这个目录:

/etc/ld.so.conf.d

在该路径下添加一个文件:

touch [name].conf

用vim打开刚刚新建的.conf文件,在配置文件里将动态库的路径拷贝进去,然后使用ldconfig命令使配置文件生效

4.动态库的底层

当进程被加载到内存时,它对应的动态库并不会随之加载进内存,而是当进程要使用动态库里的内容时,页表发现动态库不存在,发生缺页中断,于是OS到磁盘中找到动态库将它加载到内存中。在进程内部,动态库的代码被放入在地址空间中的一块空间中(静态库也在这);而在物理地址中,进程的代码和动态库独立(静态库直接加载到进程的代码中),使得动态库像一个独立的进程存在于内存中。当其他进程要使用该动态库时,页表发现动态库已经在内存中了,于是就直接映射,不允许再次将动态库加载到内存中,即多个进程共享同一个动态库。

当进程使用动态库中的某个函数时,库里的函数本身就有地址,而地址空间中本身也有一套地址。所以进程不能直接使用库中的地址,它本质是将库起始位置的地址(称为偏移量),加上库中函数的地址,最终组成进程访问库中函数的地址。

在这里插入图片描述

相关命令

查看系统库文件的命令

ls /lib64

形成.o文件的命令

gcc -c [file] 形成静态.o

gcc -fPIC -c [file] 形成动态.o -fPIC表示与产生位置无关码(position independent code)

打包库的命令

  1. 静态库:

    ar -rc [file].a *.o rc表示(replace and create)存在就替换,不存在就创建

  2. 动态库:

    gcc可以直接用来形成动态库,因为实际使用中动态库的使用频率比静态库大

    gcc -shared *.o -o [lib].so -shared表示形成共享库格式(其实就是告诉gcc不要形成可执行程序)

gcc链接系统库的命令

gcc/g++不认识第三方库,所以在编译的时候要加-l选项,但要注意库文件一般以libxx.a命名,但-l后面的选项要删去lib.a只保留中间的部分

gcc [file] -l [lib]

查看可执行程序链接的库的命令

ldd [可执行程序]

相关文章:

Linux动静态库

Linux动静态库 1.动静态库介绍 在程序翻译的链接阶段&#xff0c;其实就是把一堆.o文件链接在一起形成.exe文件。如果一个程序中需要链接很多个.o文件&#xff0c;那么这些.o文件就需要被打包才方便管理&#xff0c;**库文件本质就是把.o文件打包。**库文件是一种提高开发效率…...

线程与进程___(一)

1、线程 Thread 类创建得线程为前台线程&#xff0c;线程池中的为后台线程&#xff0c;&#xff0c;&#xff0c;Main方法结束后&#xff0c;前台线程仍然运行&#xff0c;直到完成&#xff0c;而后台线程立刻结束。 调用线程时候不会立刻进入 Running 状态&#xff0c; 而是…...

Google IO 2024有哪些看点呢?

有了 24 小时前 OpenAI 用 GPT-4o 带来的炸场之后&#xff0c;今年的 Google I/O 还未开始&#xff0c;似乎就被架在了一个相当尴尬的地位&#xff0c;即使每个人都知道 Google 将发布足够多的新 AI 内容&#xff0c;但有了 GPT-4o 的珠玉在前&#xff0c;即使是 Google 也不得…...

纯血鸿蒙APP实战开发——Navigation页面跳转对象传递案例

介绍 本示例主要介绍在使用Navigation实现页面跳转时&#xff0c;如何在跳转页面得到转入页面传的类对象的方法。实现过程中使用了第三方插件class-transformer&#xff0c;传递对象经过该插件的plainToClass方法转换后可以直接调用对象的方法&#xff0c; 效果图预览 使用说…...

Windows C++ 读取、修改配置文件.ini

目录 一、INI文件基础介绍 二、GetPrivateProfileString和WritePrivateProfileString 解释&#xff1a; 一、INI文件基础介绍 INI文件&#xff08;初始化文件&#xff09;是一种简单的文本文件&#xff0c;用于存储程序的配置设置。它们通常用于Windows操作系统环境中&#x…...

物联网D3——按键控制LED、光敏传感蜂鸣器

按键控制LED 按键抖动&#xff0c;电平发生变化&#xff0c;可用延时函数抵消按键抖动对系统的影响 传感器电路图 按键电路图 c语言对应类型 “_t”后缀表示使用typedef重命名的数据类型 枚举类型 #include<iostream> using namespace std; //定义枚举类型 typedef enu…...

Spring初学入门(跟学笔记)

一、Spring概述 Spring是一款主流的Java EE轻量级开源框架。 Spring的核心模块&#xff1a;IoC&#xff08;控制反转&#xff0c;指把创建对象过程交给Spring管理 &#xff09;、AOP&#xff08;面向切面编程&#xff0c;在不修改源代码的基础上增强代码功能&#xff09; 二、…...

二进制部署k8s---下篇

一 master02 节点部署 1 先在master01 添加映射master02 对master02进行环境初始化 3 从 master01 节点上拷贝证书文件、各master组件的配置文件和服务管理文件到 master02 节点 scp -r /opt/etcd/ root192.168.11.12:/opt/ scp -r /opt/kubernetes/ root192.168.11.12:/opt…...

基于Sentinel-1遥感数据的水体提取

本文利用SAR遥感图像进行水体信息的提取&#xff0c;相比光学影像&#xff0c;SAR图像不受天气影响&#xff0c;在应急情况下应用最多&#xff0c;针对水体&#xff0c;在发生洪涝时一般天气都是阴雨天&#xff0c;云较多&#xff0c;光学影像质量较差&#xff0c;基本上都是利…...

C++自定义头文件使用(函数和类)

简单案例需求&#xff1a; 1&#xff0c;计算正方形和三角形的周长——函数 2&#xff0c;模拟不同类型的动物叫声——类 一、创建项目 C空项目 Class_Study 二、创建主函数 在源文件下添加新建项&#xff0c;main.cpp 三、自定义头文件——函数 需求&#xff1a;1&a…...

消息队列选型

一、要解决的问题 1.1 异步 分析&#xff1a; 需要根据场景来判断。若整体链路的逻辑中&#xff0c;某些逻辑是不需要强实时的&#xff0c;滞后一段时间是允许的&#xff0c;同时又不会对用户带来不好的体验&#xff0c;那么可以使用MQ完成异步操作。 例如&#xff1a;秒杀场…...

ubuntu在conda环境中使用 pip install -r requirements.txt但是没有安装在虚拟环境中

whereis pip pip listubuntu在conda环境中使用pip install lpips0.1.3 但是安装在了这里 Requirement already satisfied: lpips0.1.3 in /home/uriky/anaconda3/lib/python3.11/site-packages (0.1.3) 就会出现黄色波浪&#xff0c;未在虚拟环境中安装包 解决办法1&#xff1…...

力扣127.单词接龙讲解

距离上一次刷题已经过去了.........嗯............我数一一下............整整十天&#xff0c;今天再来解一道算法题 由于这段时间准备简历&#xff0c;没咋写博客。。今天回来了&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&…...

latex笔记

双列排版&#xff0c;右端margin不对齐怎么解决 如下图这种情况&#xff0c; 解决方法&#xff1a; 在文档开头引入ragged2e包 \usepackage{ragged2e}然后在子章节的开头添加 \justifying\subsection{camouflaged object detection based on coarse-to-fine strategy} \just…...

秋招算法——AcWing101——拦截导弹

文章目录 题目描述思路分析实现源码分析总结 题目描述 思路分析 目前是有一个笨办法&#xff0c;就是创建链表记录每一个最长下降子序列所对应的节点的链接&#xff0c;然后逐个记录所有结点的访问情况&#xff0c;直接所有节点都被访问过。这个方法不是很好&#xff0c;因为需…...

IDEA不能创建新项目和新模块

问题&#xff1a; IDEA不管是创建新项目还是新模块都创建不成功&#xff0c;会报如下图错误 解决方案&#xff1a; 在电脑设置里搜索 “防火墙和网络保护” &#xff0c;打开如下图所示 找到你所安装的IDEA&#xff0c;更改设置&#xff0c;选中IDEA 最后&#xff0c;确定&am…...

WebRTC 的核心:RTCPeerConnection

WebRTC 的核心&#xff1a;RTCPeerConnection WebRTC 的核心&#xff1a;RTCPeerConnection创建 RTCPeerConnection 对象RTCPeerConnection 与本地音视频数据绑定媒体协商ICE什么是 Candidate&#xff1f;收集 Candidate交换 Candidate尝试连接 SDP 与 Candidate 消息的互换远端…...

LeetCode hot100-39-N

101. 对称二叉树给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。做不出来哇&#xff0c;递归一生之敌 普通的对一棵树的递归遍历根本没办法只接比较左子树的左和右子树的右这样来比较&#xff0c;所以这题比较巧妙的是把这棵树当做两棵树一样去遍历比较。 官方…...

NumPy常用操作

目录 一:简介 二:NumPy 常用操作 三:总结 一:简介 是一个开源的Python库,它为Python提供了强大的多维数组对象和用于处理这些数组的函数。NumPy的核心是ndarray,它是一个高效的多维数组容器,用于存储和处理大规模的数据。NumPy还提供了许多数学函数,用于数组之间的操…...

学习笔记——字符串(单模+多模+练习题)

单模匹配 Brute Force算法&#xff08;暴力&#xff09; 算法思想 母串和模式串字符依次配对&#xff0c;如果配对成功则继续比较后面位置是否相同&#xff0c;如果出现匹配不成功的位置&#xff0c;则j&#xff08;模式串当前的位置&#xff09;从头开始&#xff0c;i&…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...