Linux:动态库和静态库

news2024/12/28 22:33:27

静态库与动态库


A:静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。

B:动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。

C:一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。

D:在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)

E:动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。

举个例子:

测试程序

add.h

int add(int a, int b);

add.c

#include "add.h"
int add(int a, int b)
{
    return a + b;
}

sub.h

int sub(int a, int b);

sub.c

#include "add.h"
int sub(int a, int b)
{
    return a - b;
}

main.c
#include <stdio.h>
#include "add.h"
#include "sub.h"
int main(void)
{
	int a = 10;
	int b = 20;
	printf("add(%d,%d)=%d\n", a, b, add(a, b));
	a = 100;
	b = 20;
	printf("sub(%d,%d)=%d\n", a, b, sub(a, b));
}
 生成静态库

生成静态库: 

ar是gnu归档工具,rc表示(replace and create)

查看静态库中的目录列表:

t:列出静态库中的文件,v:verbose 详细信息

-L 指定库路径 ,-l 指定库名

测试目标文件生成后,静态库删掉,程序照样可以运行!

库搜索路径

 A:从左到右搜索-L指定的目录。

B:由环境变量指定的目录 (LIBRARY_PATH

C:由系统指定的目

  a:/usr/lib

  b:/usr/local/lib

生成动态库

A:shared: 表示生成共享库格式

B:fPIC:产生位置无关码(position independent code)

C:库名规则:libxxx.so

为什么要先:gcc -fPIC -c sub.c add.c ?

  1. 编译源代码gcc 是 GNU 编译器集合,用于编译 C 或 C++ 源代码文件(.c 文件)。

  2. 生成对象文件-c 选项告诉 gcc 编译源文件但不要进行链接。编译后生成的目标文件(也称为对象文件)扩展名为 .o,例如 sub.oadd.o

  3. 位置无关代码(Position Independent Code, PIC)-fPIC 选项指示 gcc 生成位置无关代码。这是创建共享库(shared libraries)所必需的,因为共享库的代码在内存中的位置可能会在不同的程序中变化,而它需要能够在这些不同位置正常工作。

  4. 准备共享库:生成的对象文件(.o 文件)是准备创建共享库的中间步骤。共享库在运行时被动态加载到内存中,并且可以在多个进程之间共享。

  5. 避免重复编译:如果源代码没有变化,使用 -fPIC 编译生成的对象文件可以被重用,无需重新编译源代码,这可以加快编译过程。

  6. 模块化:将不同的功能模块编译成单独的对象文件,可以提高模块化和可维护性。如果只需要更新或重新编译一个模块,不需要重新编译整个程序。

  7. 优化和错误检查:编译每个文件为单独的对象文件允许编译器对每个模块进行优化,并且在编译过程中可以单独检查每个模块的错误。

  8. 兼容性:使用 -fPIC 选项可以确保编译出的对象文件既可以用于生成共享库,也可以用于生成静态库或直接链接到可执行文件中。

         总结来说,gcc -fPIC -c sub.c add.c 命令的目的是将 sub.cadd.c 这两个源文件编译成位置无关的对象文件,为下一步生成共享库或静态库做准备。这样做可以提高代码的可重用性、模块化和编译效率。

使用动态库

编译选项

        l:链接动态库,只要库名即可(去掉lib以及版本号)

        L:链接库所在的路径

运行动态库

        1、拷贝.so文件到系统共享库路径下, 一般指/usr/lib

        2、更改 LD_LIBRARY_PATH

LD_LIBRARY_PATH 是一个在类 Unix 系统中使用的环境变量,它对动态链接器的行为有直接影响。

定义:

LD_LIBRARY_PATH 用于在运行时指定动态链接器搜索共享库(如 .so 文件)的路径。这个环境变量可以包含一个或多个以冒号(:)分隔的目录路径。

工作原理:

当一个程序启动时,如果它依赖于动态链接的共享库,动态链接器(通常是 ld.sold-linux.so)将负责加载这些库。动态链接器会按照以下顺序搜索库:

  1. 程序的 rpath(如果存在):这是编译时嵌入到程序可执行文件中的库搜索路径。
  2. LD_LIBRARY_PATH 环境变量:如果程序没有 rpath 或者 rpath 中没有找到所需的库,动态链接器会接着在 LD_LIBRARY_PATH 指定的路径中搜索。
  3. 系统的默认库路径:如果以上两个步骤都没有找到库,动态链接器会最后在系统的标准库路径(如 /lib/usr/lib/lib64/usr/lib64 等)中搜索。

   3、ldconfig 配置/etc/ld.so.conf.d/,ldconfig更新

  • ldconfig 会读取 /etc/ld.so.conf 文件以及 /etc/ld.so.conf.d/ 目录下的所有配置文件,这些文件定义了动态链接器搜索共享库的路径。
  • 根据这些配置文件,ldconfig 会搜索指定的目录,查找共享库文件(通常是 .so 文件),并更新 /etc/ld.so.cache 文件。

http://t.csdnimg.cn/FY6pricon-default.png?t=N7T8http://t.csdnimg.cn/FY6pr

[root@localhost linux]# cat /etc/ld.so.conf.d/bit.conf
 
/root/tools/linux
 
[root@localhost linux]# ldconfig

动态库与静态库的区别 

静态链接

        静态库在编译期间将库中的代码加载到程序里,加载成功后,后续与库无关。(编译成库后,把库删掉也能用)。

动态链接

        动态库是运行时加载的,运行时要找到动态库的位置(操作系统知道),加载并运行(运行的过程中不能离开库本身)。

静态库优缺点

        优点:运行速度较快,运行时无需动态链接。

        缺点:占用内存大,不同的进程要使用静态库,都要拷贝一份。维护成本高,静态库一旦更新,程序也要随之再编译一次。

动态库优缺点

        优点:占用内存小,多进程之间可以共享资源。维护成本较低,更新是只需要重新加载动态库即可。

        缺点:运行时相对于静态库来说较慢(因为要通过指定的路径找到动态库)。

 

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

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

相关文章

Ubuntu24.04设置国内镜像软件源

参考文章&#xff1a; Ubuntu24.04更换源地址&#xff08;新版源更换方式&#xff09; - 陌路寒暄 一、禁用原来的软件源 Ubuntu24.04 的源地址配置文件发生改变&#xff0c;不再使用以前的 sources.list 文件&#xff0c;升级 24.04 之后&#xff0c;该文件内容变成了一行注…

Java | Leetcode Java题解之第334题递增的三元子序列

题目&#xff1a; 题解&#xff1a; class Solution {public boolean increasingTriplet(int[] nums) {int n nums.length;if (n < 3) {return false;}int first nums[0], second Integer.MAX_VALUE;for (int i 1; i < n; i) {int num nums[i];if (num > second…

日常网站优化:SEO的6项目日常例行工作

大部分人每天都会登录自己的网站&#xff0c;或者至少每周登录一次。但是&#xff0c;如果你是一家小企业或者团队的负责人&#xff0c;你可能会有很多其他的工作要做&#xff0c;相对的&#xff0c;就没有那么多的时间可以花在SEO上。 当然您也可以选择一个专业的团队&#x…

差异对比:云服务器PK物理服务器

【若您对以下内容感兴趣&#xff0c;欢迎联系或关注我们】 在服务器领域&#xff0c;云服务器和物理服务器是两种常见的选择&#xff0c;它们在多个方面存在明显的区别。 一、资源虚拟化 云服务器&#xff1a;基于物理服务器通过虚拟化技术构建而成&#xff0c;多个虚拟服务…

flutter 画转盘

import package:flutter/material.dart; import dart:math;const double spacingAngle 45.0; // 每两个文字之间的角度 // 自定义绘制器&#xff0c;ArcTextPainter 用于在圆弧上绘制文字 class ArcTextPainter extends CustomPainter {final double rotationAngle; // 动画旋…

多种办公功能的WORD VBA程序

word的VBA办公助手 源代码 Option Explicit 需要引用 excel 16.0 库 所有内容仅供个人学习使用&#xff0c;严禁传播。1-公共变量-表格属性------------------------------------------------------------------------- Dim Hg% hg:行高 Const K1 0.1 Dim Flg_bh As Boolean …

力扣题/二叉树/二叉树中的最大路径和

二叉树中的最大路径和 力扣原题 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。路径和 是路径中各节点值的总和。给你一个二叉树…

景联文科技:图像标注的类型有哪些?

图像标注是计算机视觉领域中一个非常重要的步骤&#xff0c;它是创建训练数据集的关键组成部分&#xff0c;主要用于帮助机器学习算法理解图像内容。 以下是图像标注的一些主要类型&#xff1a; 1. 边界框标注&#xff1a; • 这是最常见的标注方式之一&#xff0c;通常用于…

Python深度学习框架库之caffe使用详解

概要 Caffe 是一个由伯克利视觉与学习中心(BVLC)开发的深度学习框架,以其速度快、模块化设计和社区支持而闻名。Caffe 适用于视觉识别任务,广泛应用于学术研究和产业实践中。Caffe 提供了一个强大的 Python 接口,使开发者能够方便地使用 Python 进行深度学习模型的开发和…

QT 简易音乐播放器

目录 放置控件 获取mp3文件 播放音乐 准备工作 加载模块 加载头文件 new一个output对象,Mediaplayer对象 把outpout对象交给mediaplayer对象 给播放器设置音乐 播放 优化 上一曲下一曲功能 双击歌曲播放 获取音乐时长和音乐播放时间 让音乐进度条跟随音乐走 调…

解决element-ui回车键绑定按钮功能后却刷新浏览器的问题

最近写代码时&#xff0c;遇到要给回车键绑定确定的功能&#xff0c;并且打开对话框时要自动获取输入框焦点&#xff0c;发现一但重新打开浏览器&#xff0c;第一次执行回车键的功能时就会刷新浏览器&#xff0c;后续则会成功执行。但是一但再一次重新打开浏览器&#xff0c;还…

【简历】北京某985大学:JAVA秋招简历指导,面试通过率较高

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 我们今天要看一位来自25届985同学的JAVA简历。 既然要参加校招的话&#xff0c;我们校招法典的第一准则&#xff1a;定你的学校层次。 …

win11中vsstudio2019使用winusb开usb应用

根据微软官方文档&#xff0c;在安装使用winusb之前&#xff0c;需求wdk环境。 下载 Windows 驱动程序工具包 (WDK) - Windows drivers | Microsoft Learn WDK环境安装 访问安装官网Previous WDK versions and other downloads - Windows drivers | Microsoft Learn 点开vs…

鸿蒙「TaskPool|Worker」多线程并发使用详解,这一篇足够!

概念介绍 鸿蒙的多线程并发TaskPool和Worker&#xff0c;他们具有相同内存模型&#xff0c;线程间隔离内存不共享。在项目中若使用到&#xff0c;有几个较重要的条件或特点这里简单作出列举。 CPU密集型任务&#xff0c;说白了是计算型耗时任务&#xff1b; I/O密集型任务&…

C# 静态方法和实例方法

一、静态成员&#xff0c;实例成员&#xff0c;静态方法&#xff0c;实例方法 静态成员就是用static修饰的字段&#xff1b; 实例成员就是没有被static修饰的字段&#xff1b; 静态方法就是用static修饰的方法&#xff1b; 实例方法就是没有被static修饰的方法&#xff1b;…

OriginPro快速上手指南:数据可视化与分析的利器

目录 OriginLab - Origin and OriginPro - Data Analysis and Graphing Softwarehttps://www.originlab.com/​编辑 一、安装与界面概览 安装 界面概览 二、基础操作 数据输入 创建图表 三、高级功能 数据分析 自动化与脚本 Origin 提供了几个小工具 四、技巧与提示…

AI编程-vscode安装“通义灵码”

“通义灵码”是一款基于阿里云通义代码大模型打造的智能编码助手 1、vscode中&#xff0c;选择插件&#xff0c;输入“tongyi” &#xff0c;弹出插件选项 2、点击install 安装 3、弹出登录提示 4、选择log in&#xff0c;弹出阿里云登录界面 登录成功后提示 5、返回vscode…

【吸引力法则】人生欲:追求深度体验与宇宙链接

文章目录 探究人生欲&#xff1a;追求深度体验与宇宙链接唤醒人生欲&#xff1a;克服配得感的三大障碍法执的压制家庭的继承 探究人生欲&#xff1a;追求深度体验与宇宙链接 在人生的广阔舞台上&#xff0c;我们时常探寻着那些能够引领我们走向更深层次成长与体验的力量。今天&…

C语言—函数递归

一、递归概念 递归其实是⼀种解决问题的⽅法&#xff0c;在C语⾔中&#xff0c;递归就是函数⾃⼰调⽤⾃⼰。下面举一个例子&#xff1a; 上述就是⼀个简单的递归程序&#xff0c;只不过上⾯的递归只是为了演⽰递归的基本形式&#xff0c;不是为了解决问题&#xff0c;代码最终…

ddos造成服务器瘫痪后怎么办

在服务器遭受DDoS攻击后&#xff0c;应立即采取相应措施&#xff0c;包括加强服务器安全、使用CDN和DDoS防御服务来减轻攻击的影响。rak小编为您整理发布ddos造成服务器瘫痪后怎么办。 当DDoS攻击发生时&#xff0c;首先要做的是清理恶意流量。可以通过云服务提供商提供的防护措…