Linux系统编程 --- 动静态库

一、回顾,制作一个库

libXXX.a --- 静态链接

libYYY.so --- 动态链接

设计一个库:

 把我们提供的方法,给别人用:

1、把源文件直接给他

2、把我们的源代码打包成库 = 库 + 头文件。

原理:把所有的.o文件打包成.a文件也就是静态库文件

makefile文件里的依赖关系

静态库的发布

二、站在库的使用者的角度

1、静态库。

 指定路径找.h文件

指定路径找静态库链接

这里我们需要链接哪个库

我不想这么干该怎么办?我们可以把库软连接放到系统默认的lib目录下,库的安装:

由于gcc默认不认识第三方库。所以我们需要把库通过 -l 选项指定链接哪个库。

结论:1、第三方库,往后使用的时候,必定要用gcc -L 选项。

           2、深刻理解errno的本质。

           3、如果系统中只提供静态链接,gcc则只能对该库进行静态链接。

           4、如果系统中需要链接多个库,则gcc可以链接多个库。

ldd a.out 来查看动态链接,gcc默认是动态链接的,但是这里没有提供动态库,所以就只能静态链接。

2、动态库。

第一步:

 fPIC 与位置无关码。

第二步:打包动态库,有gcc完成,动态库就是gcc的亲儿子,gcc亲历亲为。

由于动态库必须被加载到内存中,所以系统会默认加上x权限,也就是执行权限。

编译选项和动态库的选项相同,但是在运行时会发生错误:

这是为什么呢?猜想配置环境变量,这是因为上面的选项只是让编译器可以编译我们的程序,但是编译完成后,形成的可执行程序还是找不到我们的动态库在哪里,所以我们可以直接拷到lib64目录里面,建立软连接到系统库目录下lib64。

这个问题就解决了!还有两种方法:配置echo $LD_LIBRARY_PATH 环境变量。

将自己的库所在的路径,添加到系统的环境变量LD_LIBRARY_PATH中。

添加配置文件 .bash_profile。

在ld.so.conf.d目录里面添加一个配置文件*.conf。ldconfig重新加载这个配置文件。也就是说,/etc/ld.so.conf.d 建立自己的动态库路径的配置文件,然后重新ldconfig即可。

对于我们平常的开发中,我们用的库都是别人的成熟的库,都采用直接安装到系统的方式!

动态库在进程中运行的时候是要被加载的,而静态库没有。常见的动态库被所有的可执行程序动态链接的,都要使用,动态库又称共享库。所以,动态库在系统加载之后,会被所有进程共享!那是怎么被共享的呢?

三、动态库是怎么被加载的。

结论:建立映射,从此往后,我们执行的任何代码,都是在我们的进程地址空间中执行!

事实:系统在运行中,一定会存在多个动态库,操作系统要管理起来 --- 先描述,再组织。

系统中,所有库的加载情况OS非常清楚。

共享库里面有errno全局变量,不会造成我们的进程产生干扰,写入会发生写时拷贝。

fPIC 与地址无关码?

关于地址:

程序没有加载前的地址

程序编译好之后,内部有地址的概念。平坦模式,编译器也要考虑操作系统!

这里的地址为虚拟地址或者逻辑地址

程序加载后的地址

动态库的地址

相对地址和绝对地址

动态库内部的地址使用相对地址。 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

llama神经网络的结构,llama-3-8b.layers=32 llama-3-70b.layers=80; 2000汉字举例说明

目录 llama-3-8b.layers=32 llama-3-70b.layers=80 llama神经网络的结构 Llama神经网络结构示例 示例中的输入输出大小 实际举例说明2000个汉字文本数据集 初始化词嵌入矩阵 1. 输入层 2. 嵌入层 3. 卷积层 4. 全连接层 llama-3-8b.layers=32 llama-3-70b.laye…

如何快速看完一个网页上的视频

如何快速看完一个视频 懂的都懂。 Edge浏览器 添加下面两个书签: javascript:document.querySelector("video").dispatchEvent(new Event("ended"))javascript:var vdocument.querySelector("video");if(v){v.mutedtrue;v.playba…

Javaweb项目|ssm基于ssm的宠物医院管理系统的设计与实现vue

收藏点赞不迷路 关注作者有好处 文末获取源码 一、系统展示 二、万字文档展示 基于ssm基于ssm的宠物医院管理系统的设计与实现vue 开发语言:Java 数据库:MySQL 技术:SpringSpringMVCMyBatisVue 工具:IDEA/Ecilpse、Navicat、Ma…

JMeter接口测试-5.JMeter高级使用

JMeter高级使用 案例: 用户登录后-选择商品-添加购物车-创建订单-验证结果 问题: JMeter测试中,验证结果使用断言,但断言都是固定的内容假如要判断的内容(预期内容)是在变化的, 有时候还是不确定的, 那该怎么办呢? 解决&…

stm32入门-----硬件I2C读写MPU6050

目录 前言 一、stm32中I2C库函数介绍(stm32f10x_i2c.h) 1.初始化 2.使能操作 3.生成起始位和结束位标志 4.发送I2C从机地址 5.发送数据和接收数据 6.发送应答位 7.状态检测 二、硬件I2C读取MPU6050 1.电路连线图 2.主要工程文件 3.MPU6050.…

虚拟机(CentOS7)安装jenkins

centos7安装jenkins 前提条件,安装jdk与maven 1、JDK17安装 # 进入系统管理员 sudo root # 进入对应文件夹下 cd /usr/local # 下载jdk17 wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm # rpm命令安装下载的jdk17 rpm -ivh jdk-17_li…

GPU爆显存 | Windows下杀死GPU进程释放显存

文章目录 0 问题引入1 解决方案 0 问题引入 深度学习的时候,用CUDA加速训练了,但是进程没有完全结束,再跑的时候爆显存了。 1 解决方案 查看当前的GPU进程 nvidia-smi通过如下命令来杀死指定的进程。 taskkill /PID PID号 /F //例如&am…

Netty一

Netty Netty介绍 Netty应用场景 I/O模型 阻塞IO 同步非阻塞IO 异步非阻塞IO BIO NIO AIO对比 Netty线程模型 Reactor模式 单Reactor单线程 单Reactor多线程 主从Reactor多线程 Netty模型 异步模型 Future-Listener机制 TCP粘包拆包基本介绍 Netty内存使用 Netty内存池化 Netty…

Spring中使用Async进行异步功能开发实战-以大文件上传为例

目录 前言 一、场景再现 1、Event的同步机制 二、性能优化 1、异步支持配置 2、自定义处理线程池扩展 3、将线程池配置类绑定到异步方法 三、总结 前言 在之前的博客中,曾将讲了在SpringBoot中如何使用Event来进行大文件上传的解耦,原文地址&…

Java-变量,运算符,输入与输出

目录 一,语法基础 1.基本Java程序 2.语法基础 2.1 变量 2.2 常量限制(fiinal)类比C中的const 2.3 类型转化 2.4 运算符 2.5 表达式 2.5 输入与输出 2.5.1 输入 2.5.2 输出 一,语法基础 1.基本Java程序 public class Main{public static void…

C#使用NPOI进行Excel和Word文件处理(一)

文章目录 前言文件大小性能NPOI 的优势示例代码性能优化建议总结Github 地址链接导出效果 前言 NPOI 是一个非常流行的用于在 .NET 环境中操作 Office 文件(包括 Excel 文件)的开源库。它的功能非常强大,但性能和文件大小问题可能因具体的使…

虚拟机如何使用pxe服务实现自动安装系统

一、前提 服务机为rhel7.9 因为我们需要虚拟机为服务器来给要安装系统的虚拟机分配IP 所以要先将VMWare的NAT模式的DHCP自动分配取消,如图: yum install httpd -y systemctl enable --now httpd 二、基于HTTP协议的PXE服务器 1、首先需要进入图形化…

Redis-管道

面试题 如何优化频繁命令往返造成的性能瓶颈 Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。一个请求会遵循以下步骤: 1 客户端向服务端发送命令分四步(发送命令-命令排队一命令执行-返回结果),并监听Socket返回,通常以阻塞模式等待服…

How does age change how you learn?(2)年龄如何影响学习能力?(二)

Do different people experience decline differently? 不同人经历的认知衰退会有不同吗? Do all people experience cognitive decline uniformly?Or do some people’s minds slip while others stay sharp much longer? 所有人经历的认知衰退都是一样的吗?还是有些人…

Linux--应用层协议HTTP

HTTP协议 HTTP协议(HyperText Transfer Protocol,超文本传输协议)是互联网上应用最为广泛的一种网络协议,它基于TCP/IP通信协议来传送数据,规定了浏览器与服务器之间数据传输的规则,确保数据能够在网络源头…

JavaEE 第1节 认识多线程

本节目标(全是重点,都必须掌握) 1、了解什么是线程、多线程、进程以及他们之间的关系 2、了解多线程的优势以及各种特性 3、用Java掌握多种创建线程的方法 一、线程、多线程、进程 1、概念 1.基本概念 这三个名词的概念可以用一个餐馆…

安卓自定义控件

文章目录 引入布局创建自定义控件 引入布局 首先创建一个项目&#xff0c;创建一个空的活动。然后右键单击res/layout创建一个Layout Resource File文件&#xff0c;取名title.xml。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmln…

【Linux】win 环境下进行 linux开发

文章目录 IDE 安装Python开发创建一个新项目安装 Python、pip 和 venv创建虚拟环境&#xff08;建议&#xff09;运行Python 参考文章 想要win 环境下进行 linux开发&#xff0c;需要依赖于wsl。wsl安装可参考上篇文章 【Linux】wsl win安装Linux环境 这里主要介绍在 linux下…

《学会 SpringMVC 系列 · 剖析入参处理》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

【大模型系列】Video-LLaVA(2023.12)

Paper&#xff1a;https://arxiv.org/pdf/2311.10122v2Github&#xff1a;https://github.com/PKU-YuanGroup/Video-LLaVAHuggingface&#xff1a;https://huggingface.co/spaces/LanguageBind/Video-LLaVAAuthor&#xff1a;Bin Lin et al. 北大袁粒团队 文章目录 1 Video-LLa…