[Linux系统编程] 静态库与动态库

一.库的概念

库是写好的现有的,成熟的,可以复用的代码。
本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)。
静态链接: 库随着程序一起编译,成为可执行程序的一部分,空间开销大,运行速度快
动态链接: 库只有在程序执行时被用到时才会被加入到内存中,空间开销小,运行较慢

二.Linux环境下静态库的制作及使用

首先使用-c选项,将c文件编译为二进制文件(.o),然后使用ar工具将二进制文件制作为静态库。

ar rcs [libXXXX.a] [所用到的.o文件]
其中,库文件名字XXXX可随意编写,但必须以lib为开头,.a为结尾

在这里插入图片描述
使用静态库的过程中,使用gcc编译c文件时,需要加上静态库的存储目录以及名称。
静态库使用,是将静态库实际编译至可执行文件。
如 : gcc test.c ./lib/libtest.a

注意:
源文件中必须要有函数的定义才可正常编译,若在源文件中没有包含库文件中的函数定义,系统会为其自动隐式定义,可正常执行,但会报错,使用-Wall选项可以查看有报错信息
所以在使用静态库的时候,一般都会在源文件中包含一个头文件,内部是所有的静态库函数定义。
在头文件中,要包含一个头文件守卫,防止重定义。

在这里插入图片描述

总结使用过程:
gcc [c文件] [库文件目录及名称] -I [头文件目录] -o [可执行文件命名]
如:gcc test.c ./a/libmymath.a -I ./b/ -o test.exe

gcc中选项:

-I 指定头文件目录
-o 指定文件名称
-Wall 查看报错信息
-g 增加调试语句
-c 只做预处理,编译,汇编操作,得到二进制文件,不进行连接操作。

三.Linux环境下动态库的制作及使用

第一步:
与静态库制作不同,在生成二进制文件(.o)时,需要生成与位置无关的代码,使用选项**-fPIC来实现。
原因:因为动态库是在程序运行时加载进入内存,其内部函数的地址绑定时间晚于源文件函数,只有动态库加载进入内存时,这些函数才有确切的地址(地址回填),而源文件中定义的函数在链接后就已经绑定地址。
第二步:
制作动态库,使用
gcc -shared -o [库名] [二进制文件]**
第三步:
使用动态库时,与静态链接不同,不会把动态库编译进入可执行文件,但需要指定库
-l 指定库名(去掉前缀lib 和 后缀so)
-L 指定目录
gcc [执行文件] -l [库名] -L [目录地址]
第四步:
此时的可执行文件还不可运行,这是因为动态链接器还无法工作,动态链接器需要找到库的存放目录,通过配置环境变量LD_LIBRARY_PATH 来指定。
执行一次环境变量的配置,在下次启动终端时不在生效,也就是临时生效。
为了解决这个问题,可修改.bashrc配置文件,加入如下语句,可以实现启动时自动读取库目录。
在这里插入图片描述

在这里插入图片描述在这里插入图片描述

四.链接过程中的地址回填和数据段合并

1.什么是地址回填?
上文讲动态库链接时,动态库函数的地址会晚于源文件中函数的地址绑定,它们是在动态库加载进入内存后才进行绑定的,在加载入内存后,进行动态链接时会进行这个操作,被称为地址回填。
2.什么是数据段合并
其目的就是为了减少内存开销。
在Linux系统中,内存分页管理,一个页面多数为4K或8K

如下内存图中的可改数据段和不可改数据段,如果它们被分配的页面大小超过它们本身的所需要存储大小,就会降低内存的利用率。于是可以将某些数据段合并,用于增大内存利用率。这就是数据段合并。
在这里插入图片描述

GCC编译过程:

在这里插入图片描述程序中头文件与源文件不在同一目录下,需要使用gcc -I 指定头文件目录位置

在这里插入图片描述
使用C++ 11新标准时,需要加 -std=c++11
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nvidia origin nx 刷机JETPACK 6

条件: 1.sdkmanager 链接:https://pan.baidu.com/s/1pmeT7_vKF_NXvP8xEhCelw?pwd8q1e 提取码:8q1e 2.ubuntu 20或者ubuntu22 3.nvidia orin nx Nvidia Jetson Orin NX(一)开始刷机_jetson nx刷机-CSDN博客 …

CatDDoS僵尸网络与DNSBomb攻击:DDOS攻击最新变种

在近期的网络安全领域,两大严峻挑战浮出水面,为中国乃至全球的网络防护体系敲响了警钟。中国安全厂商奇安信的X实验室团队揭露了一波名为CatDDoS的恶意软件攻击浪潮,与此同时,一种创新且隐蔽的拒绝服务攻击技术——DNSBomb&#x…

操作系统真象还原:完善MBR

第3章-完善MBR 这是一个网站有所有小节的代码实现,同时也包含了Bochs等文件 编译器给程序中各符号(变量名或函数名等)分配的地址,就是各符号相对于文件开头的偏移量 。 section 称为节,在有的编译器中,同…

【注册表删除】Navicat Premium 16的试用期已过期的解决方案

文章目录 【问题】【解决方式】 【问题】 使用Navicat Premium 16提示试用期已过期,如下图所示情况: 【解决方式】 1、关闭Navicat Premium 16 确保Navicat Premium 16处于关闭状态。 2、Win R,输入 regedit 回车 3、删除Data文件夹 在注…

硬盘监控,保障硬盘性能

硬盘驱动器是个人计算机和服务器中用于存储数字数据的硬件部件,硬盘突然故障可能导致永久数据丢失,大多数硬盘驱动器使用自我监控、分析和报告技术(SMART)来跟踪各种性能指标并分析其自身的运行状况。然而,并不是所有的…

史上最全排序算法整理(2)

本篇文章我们将接着上篇继续介绍常见的排序算法,有需要的小伙伴可以移步史上最全排序算法整理(1)查看相关内容哦 1.冒泡排序 1.1基本思想 在待排序的一组数中,将相邻的两个数进行比较,若前面的数比后面的数大就交换两…

FFMPEG+ANativeWinodow渲染播放视频

前言 学习音视频开发,入门基本都得学FFMPEG,按照目前互联网上流传的学习路线,FFMPEGANativeWinodow渲染播放视频属于是第一关卡的Boss,简单但是关键。这几天写了个简单的demo,可以比较稳定进行渲染播放,便…

软件系统测试的类型和方法介绍

测试是软件开发过程中至关重要的一环,负责验证和确认软件系统是否符合预期的需求,并帮助开发团队消除潜在的缺陷。系统测试作为软件测试中不可缺少的过程,是根据预先制定的测试计划和测试用例,以检查软件系统功能、性能、安全性和…

LED显示屏模组七大参数

LED模组是LED显示屏的核心组件,它包含LED线路板和外壳,将LED灯珠按照特定规则排列并封装,通常还会进行防水处理。随着LED显示屏行业的发展及其广泛应用,LED模组的功能和作用变得愈加重要。那么,LED模组的七大参数是什么…

开抖店必须要办理营业执照吗?不用营业执照开店的个人店能用吗?

大家好,我是电商花花。 可能大家都发现了,抖音小店个人店不用营业执照,只凭借身份证就能开店。 但是这个个人店花花并不建议大家去开,虽然说用用身份证也能开店,有效的帮我们减少了开店的成本,但是个人店…

【RLHF个人笔记】RLHF:Reinforcement Learning from Human Feedback具体过程

【RLHF个人笔记】RLHF:Reinforcement Learning from Human Feedback具体过程 RLHF训练的三个步骤步骤1:收集数据与有监督训练策略步骤2:收集数据训练奖励模型步骤3:结合奖励模型利用强化学习算法如PPO算法来优化策略 参考内容 RLHF训练的三个…

jeecgboot 同一账号只允许一个人登录

1.需求分析 jeecgboot 框架要实现同一个账号只允许一个人登录,就跟游戏账号类似,“我登录了就把你踢下去,你登录了就把我踢下去”;jwt 原理是生成 token 后一段时间内登录都有效,jeecgboot 中 jwt 和 redis 联合使用后…

易备数据备份软件:快速恢复 VMware ESXi 虚拟机

易备数据备份软件为 VMware ESXi 虚拟机提供完整的保护和备份功能。软件同时支持从 ESXi 或 vCenter 虚拟机的增量和差异备份中进行自动恢复。支持精细化的恢复,可将虚拟机恢复到某个特定的日期。 通过易备数据备份软件,可以实现虚拟机的异机恢复&#…

深入理解JVM:内存结构、垃圾收集与性能调优

目录 JDK、JRE、JVM关系? 启动程序如何查看加载了哪些类,以及加载顺序? class字节码文件10个主要组成部分? JVM结构 画一下JVM内存结构图 程序计数器 Java虚拟机栈 本地方法栈 Java堆 方法区 运行时常量池? 什么时候抛出StackOverflowError? 例如&…

元宇宙对于品牌营销有哪些影响?品牌如何加入?

元宇宙对于品牌营销带来了许多新的营销方式和策略,这些方式在传统营销中是无法实现的。以下是元宇宙对于品牌营销的主要营销方式: 1、虚拟展示: 利用元宇宙技术,品牌可以将产品或服务在虚拟世界中进行展示,用户可以通…

Leetcode - 131双周赛

一,3158. 求出出现两次数字的 XOR 值 本题是一道纯模拟题,直接暴力。 代码如下: class Solution {public int duplicateNumbersXOR(int[] nums) {int ans 0;long t 0;for(int x : nums){if(((t>>x)&1) 1){ans ^ x;}else{t | (…

深度神经网络——什么是迁移学习?

1.概述 在练习机器学习时,训练模型可能需要很长时间。从头开始创建模型架构、训练模型,然后调整模型需要大量的时间和精力。训练机器学习模型的一种更有效的方法是使用已经定义的架构,可能具有已经计算出的权重。这是背后的主要思想 迁移学习…

适合多种苛刻环境的惯性测量单元M-G370PDS

全球IMU市场d在汽车和机器人技术进步和不断增长的应用需求,保持着高速增长的趋势,其中航空航天、国防和汽车等行业对高精度、稳定和紧凑的IMU需求尤为强烈,这些行业对精度和可靠性的高要求直接影响了相关技术的发展方向。 爱普生惯性测量单…

现场辩论赛活动策划方案

活动目的: 技能竞赛中的辩论环节既可以考核员工的知识点,同时也可以考核员工业务办事能力,表达能力,是一种比较全面且较有深度的竞赛方式。 辩论赛细则: 1、时间提示 : 自由辩论阶段,每方使用时间剩…

如何将md文件精确的转换成docx文件

如何将md文件转换成docx? 文章目录 如何将md文件转换成docx?一、如何将MD文件比较完美的转换成word呢?二、方法3 步骤1、下载一个可用的MarkDown编辑器2、下载Pandoc安装 三、来进行转化了 一、如何将MD文件比较完美的转换成word呢&#xff1…