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

news2024/9/29 19:25:00

一、回顾,制作一个库

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.coloradmin.cn/o/1980275.html

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

相关文章

(免费领源码)python#Django#MYSQL医院预约挂号系统24802-计算机毕业设计项目选题推荐

摘 要 随着互联网时代的到来,同时计算机网络技术高速发展,网络管理运用也变得越来越广泛。因此,建立一个基于django 医院预约挂号系统 ,会使;医院预约挂号系统的管理工作系统化、规范化,也会提高平台形象&a…

宝塔企业版安装命令

使用方法 安装脚本: wget -O install.sh https://www.xpnal.cn/install/install_6.0.sh \&\& bash install.sh 更新脚本: curl https://www.xpnal.cn/install/update6.sh|bash 脚本说明: 没有安装过宝塔直接执行安装脚本,安装过执行更新脚本。 提醒 …

【Material-UI】多选模式(Multiple values)与Autocomplete的高级用法解析

文章目录 一、多选模式的基本用法二、高级用法1. 固定选项(Fixed options)2. 复选框(Checkboxes)3. 限制标签显示数量(Limit tags) 三、性能优化与最佳实践1. 筛选已选项(filterSelectedOptions…

Scratch的下载与安装

如果你在某搜索引擎用这个,就是离被骗钱不远了 添加图片注释,不超过 140 字(可选) 废话不多说,直接放软件安装包。重要的事情说三遍,收费的全是骗人的!收费的全是骗人的!收费的全是…

【C++题解】1015. 鸡兔同笼问题

欢迎关注本专栏《C从零基础到信奥赛入门级(CSP-J)》 问题:1015. 鸡兔同笼问题 类型:简单穷举 题目描述: 鸡兔同笼问题:一个笼子里面有鸡若干只,兔若干只。共有头 50 个,共有腿 16…

C语言的回调函数(详解qsort函数)

在上一篇文章中我们学习了指针与数组之间的关系,学习了指针数组,数组指针变量,函数指针变量和函数指针数组。那么接下来我们要学习的是一个利用函数指针变量去解决和简化各种问题的回调函数。 一、回调函数 回调函数在编程中是一种很常见的…

pip install -r requirements.txt下载某个.whl文件较慢的问题

访问PYPI官网。搜索该文件名字 如果不是自己要的版本,点击左边的Release history。 选择版本后再次在Download files页面下载.whl文件 下载完之后切换至自己的项目解释器虚拟环境。 python -m pip install 文件名.whl 如果你改名python.exe为python3.exe&#xff…

【消息队列】RabbitMQ 面试篇

🎗️ 主页:小夜时雨 🎗️专栏:消息队列 🎗️如何活着,是我找寻的方向 目录 1. RabbitMQ 有哪些工作模式?2. 如何保证消息不丢失(可靠性)3. 什么是死信队列,如…

基于K210智能人脸识别+车牌识别系统(完整工程资料源码)

运行效果: 基于K210的智能人脸与车牌识别系统工程 目录: 运行效果: 目录: 前言: 一、国内外研究现状与发展趋势 二、相关技术基础 2.1 人脸识别技术 2.2 车牌识别技术 三、智能小区门禁系统设计 3.1 系统设计方案 3.2 …

【网络编程】网络原理(一)

系列文章目录 1、 初识网络 2、网络编程的基础使用(一) 文章目录 系列文章目录前言一、端口号的使用二、UDP报文学习1.报文格式2.MD5算法 总结 前言 在前文中,主要对UDP和TCP协议有了简单的了解,而这两种协议是负责传输层的内容…

组件设计原则

state数据结构设计 用数据描述所有内容数据要结构化,易于程序操作(遍历、查找)数据要可扩展,以便增加新的功能 组件设计组件通讯 从功能上拆分层次尽量让组件原子化容器组件(只管理数据)& UI组件&am…

【MySQL】库操作,数据类型

目录 MySQL简介SQL语句分类库操作语句展示数据库创建数据库使用数据库删除数据库 数据类型整型浮点型字符串日期类型 MySQL简介 数据库有关系型数据库和非关系型数据库。 关系型数据库:是指采用了关系模型来组织数据的数据库。 简单来说,关系模型指的就…

科普文:JUC系列之ConcurrentLinkedQueue非阻塞队列用法

概叙 **Queue接口与List、Set同一级别,都是继承了Collection接口**。队列是一种数据结构.它有两个基本操作:在队列尾部加人一个元素,和从队列头部移除一个元素,队列以一种先进先出的方式管理数据。 队列分为两种&#…

pikachu漏洞平台~文件包含漏洞

在PHP程序中使用文件包含的对象可以被前端的用户控制且没有经过过滤或严格的定义,用户可以将其他的文件作为参数带入到PHP代码中解释执行,从而造成敏感信息泄露/程序文件读取/GetShell等危害的漏洞。 0x01文件包含漏洞 连接成功,完毕&#x…

聚焦IOC容器刷新环节postProcessBeanFactory(BeanFactory后置处理)专项

目录 一、IOC容器的刷新环节快速回顾 二、postProcessBeanFactory源码展示分析 (一)模版方法postProcessBeanFactory (二)AnnotationConfigServletWebServerApplicationContext 调用父类的 postProcessBeanFactory 包扫描 …

oracle(19c)用户管理

简介 本文介绍 Oracle 中的用户管理,包含以下内容: 概念介绍 系统用户 解锁 hr 用户 创建用户 用户相关案例 使用 Profile 管理用户口令 Oracle 的认证方式 重置管理员(sys)密码 1. 概念介绍 使用前可以自行安装oracle数据库 oracle19c安装&a…

【系统架构设计师】二十四、安全架构设计理论与实践④

目录 六、数据库系统的安全设计 6.1 数据库的完整性设计 6.1.1 数据库完整性设计原则 6.1.2 数据库完整性的作用 6.1.3 数据库完整性设计示例 七、系统架构的脆弱性分析 7.1 软件脆弱性的特点和分类 7.2 软件脆弱性的生命周期 7.2.1 脆弱性的引入阶段 7.2.2 产生破坏…

pythonflaskMYSQL自驾游搜索系统32127-计算机毕业设计项目选题推荐(附源码)

目 录 摘要 1 绪论 1.1研究背景 1.2爬虫技术 1.3flask框架介绍 2 1.4论文结构与章节安排 3 2 自驾游搜索系统分析 4 2.1 可行性分析 4 2.2 系统流程分析 4 2.2.1数据增加流程 5 2.3.2数据修改流程 5 2.3.3数据删除流程 5 2.3 系统功能分析 5 2.3.1 功能性分析 6 2.3.2 非功…

C++初阶学习——探索STL奥秘——模拟实现string类

1、string类的构造 上面的代码从表面看没什么问题,但是运行后会发现程序有多处bug 但是如上图一样,这样改进依然有bug 因为我们编写无参构造函数的时候,肯定要让_str默认为nullptr,但是这样的话,在main函数中创建对象…

使用npm全局安装typescript

查看npm安装 npm -v 安装typescript npm i -g typescript 查看安装 tsc 这就是标致着安装完成。