Linux 动态库和静态库

news2024/12/23 9:40:16

文章目录

  • 前言
  • 动态库创建和使用
  • 静态库创建和使用
  • 动态库和静态库差异
    • 生成过程的差异
    • 运行效果的差异
  • 补充说明
    • 库的名称的注意事项
    • 库的搜索路径的方法
    • 什么是位置无关代码
    • 动态链接与静态链接
    • /usr/lib 和 /usr/local/lib

前言

动静态库的创建和使用部分更多的是意在说明动态库和静态库在Linux操作系统中的具体存在,在此基础之上才能解说原理,分析优缺点。

动态库创建和使用

  1. 文件结构概览
    在这里插入图片描述
  2. 文件内容展示
    main.cpp
#include "myMathA.hpp"
#include "myMathB.hpp"

int main()
{
    int a = 10 ; 
    int b = 5 ; 
    printf("a=%d b=%d \n", a, b);

    myMathA(a,b);
    myMathB(a,b);

    return 0 ; 
}

myMathA.cpp :

#include "myMathA.hpp"
void myMathA(int x, int y)
{
    printf("%d\n", x + y);
}

myMathA.hpp :

#pragma once
#include <stdio.h>
void myMathA(int x, int y) ;

myMathB.cpp :

#include"myMathB.hpp"

void myMathB(int x, int y)
{
    printf("%d\n", x - y);
}

myMathB.hpp :

#pragma once
#include <stdio.h>
void myMathB(int x, int y) ; 

makefile:

main:main.cpp 
	g++  main.cpp -o main -L./ -lexample   # 使用动态库指令

.PHNOY:test
test:  
	 # 生成动态库指令
	gcc -c -fpic myMathA.cpp myMathB.cpp  
	gcc -shared myMathA.o myMathB.o -o libexample.so
	
.PHNOY:clean
clean:
	rm -f libexample.so myMathA.o myMathB.o main`
  1. 生成动态库指令:
	gcc -c -fpic myMathA.cpp myMathB.cpp
	gcc -shared myMathA.o myMathB.o -o libexample.so
  1. 使用动态库指令 :
g++  main.cpp -o main -L./ -lexample 
  1. 运行程序验证指令:
./main
  1. 运行结果: (linexample.so即为动态库)
    在这里插入图片描述

静态库创建和使用

  1. 文件结构概览:
初始文件结构和内容与动态库创建和使用结构相同,内容除了生成动态库指令和使用动态库指令不同,其他完全相同。
  1. 生成静态库指令
	gcc -c myMathA.cpp myMathB.cpp
	ar -rc libexample.a myMathA.o myMathB.o
  1. 生成结果 : libexampel.a 即为静态库
    在这里插入图片描述
  2. 使用动态库指令
	g++  main.cpp -o main -L./ -lexample 
  1. 运行结果: 一样

动态库和静态库差异

生成过程的差异

在这里插入图片描述

先说普通可执行文件生成过程,普通可执行文件的生成文件的顺序是:

 .c文件 —> .i文件  —>  .s文件  —> .o文件 —> 链接  —> .exe文件

动态库文件生成并使用的过程:

(声明了.c文件中函数的.h文件) + .c文件 —> .i文件  —>  .s文件  
—>(fpic指令生成的位置无关.o文件).o文件 —> (shared指令).so动态库文件 —> 
(参与其他普通可执行的链接过程)—> .exe文件  

静态库文件生成并使用的过程:

(声明了.c文件中函数的.h文件) + .c文件 —> .i文件  —>  .s文件  —> .o文件
 —> (ar指令生成).a静态库文件 ——> (参与其他普通可执行的链接过程) —> .exe文件  
  1. 动态链接的.o文件须是位置无关的。
  2. 在 “参与其他普通可执行的链接过程” 这一行为上,静态库直接把库中的代码整个链接到可执行文件中去,而动态库则仅仅将一个动态库的函数入口地址表编入可执行文件中去。

运行效果的差异

  1. 由于静态库是将整个库函数代码链接入可执行程序内,所以在可执行程序生成后,即使删除静态库也不会影响静态库的使用。

  2. 由于动态库只将函数入口地址表编入可执行文件中,所以在可执行程序运行开始执行前要按照指定动态库的位置找到动态库,并将动态库中的函数的内容(机器码)加载到内存中(这个操作由操作系统完成) ,故不能删除动态库,也不能移动动态库在文件系统中的位置。

  3. 由于静态库是将整个库函数代码链接入可执行程序内,所以静态库生成的可执行文件在磁盘中占用的空间相较于动态库生成的可执行文件的占用空间要大。

  4. 在运行时,只有被实际使用的动态库的代码和数据才会被加载到内存中,因此相比静态库,动态库的内存消耗可能会更小。

  5. 也 “2” 中所述现象可知,动态在运行时是被加载在内存中的,此特性结合操作系统的虚拟内存机制可以实现,多个包含了同一个动态库的可执行程序可同时使用该动态库,且只消耗一份加载该动态库的物理内存。此情况下,整体来看,相较于静态库,动态库既节省了磁盘资源又节省了物理内存资源。

  6. 由于静态库的代码和数据完整地复制到可执行文件中,因此在运行时不需要进行动态加载,可以直接执行。这样可以减少动态链接的开销,因此相较于动态库,静态库的执行效率更高。

补充说明

库的名称的注意事项

  1. 库文件的名称必须以lib开头。
  2. 使用gcc指令链接库时需要去掉库的lib开头文件后缀

库的搜索路径的方法

  1. 生成可执行文件时,用gcc -L选项指定搜索路径,如果指定了多个搜索路径,会依次搜索这些路径。
  gcc main.c -L./ -lexample
  1. 通过环境变量LD_LIBRARY_PATH搜索

可以通过设置LD_LIBRARY_PATH环境变量来指定动态库的搜索路径。该环境变量可以设置为一个或多个路径,路径之间使用冒号进行分隔。例如:

export LD_LIBRARY_PATH=/path/to/library:/another/path/to/library

追加路径的指令

export LD_LIBRARY_PATH=export LD_LIBRARY_PATH:root/example/

root/example/为追加的搜索路径

  1. 配置文件/etc/ld.so.conf和/etc/ld.so.conf.d/

可以编辑配置文件/etc/ld.so.conf,将需要搜索的动态库路径添加到其中。每行一个路径,可以使用文本编辑器打开并编辑。另外,还可以在/etc/ld.so.conf.d/目录下创建以.conf为后缀的文件,每个文件列出一个路径。编辑完成后,需要运行以下命令更新动态库缓存:

sudo ldconfig
  1. 搜索默认库路径

默认的库路径:系统会默认搜索一些常用的库路径,如/lib和/usr/lib。通常情况下,这些路径已经包含了大部分系统和常用的库文件。

动态库搜索路径的优先级是按照上述方法的顺序进行的。即先搜索LD_LIBRARY_PATH指定的路径,然后是配置文件中的路径,最后是默认的库路径。

什么是位置无关代码

位置无关代码(Position-Independent Code,PIC)是一种计算机程序代码的编译方式,它可以在内存中的任何位置执行,而不依赖于代码在内存中的具体位置。这种编译方式主要用于动态链接库(DLL)和可执行文件等需要在不同的内存地址空间中加载和执行的程序。

传统的代码编译方式会将代码中的绝对地址直接编码为指令,这样在加载到内存中时,需要进行重定位操作,将代码中的绝对地址替换为实际的内存地址。而位置无关代码则通过使用相对地址和间接寻址等技术,使得代码中的地址都是相对于某个基地址的偏移量,从而在加载时不需要进行重定位,可以直接在内存中执行。

位置无关代码的优点是可以在不同的内存地址空间中加载和执行,提高了代码的可移植性和共享性。它可以减少代码的重定位开销,简化了程序的加载过程,同时也增加了代码的安全性,防止恶意代码利用绝对地址进行攻击。

在现代操作系统和编译器中,位置无关代码已经成为一种常见的编译方式,广泛应用于动态链接库、可执行文件和操作系统内核等领域。

请注意,生成位置无关代码可能会导致一些性能损失,因为相对寻址和间接寻址可能比绝对寻址更慢。因此,在编译时需要权衡代码的可移植性和性能需求。

动态链接与静态链接

静态链接(Static Linking):
静态链接是将库文件的代码和数据复制到可执行文件中,使得可执行文件独立于外部的库文件。在静态链接中,编译器将程序所需的库文件的代码和数据直接嵌入到最终的可执行文件中。这意味着可执行文件包含了所有依赖的库函数和数据,因此它可以在没有外部库文件的情况下独立运行。静态链接的优点是可执行文件的移植性较好,但缺点是可执行文件的体积较大。

动态链接(Dynamic Linking):
动态链接是在程序运行时,通过动态链接器将程序与库文件进行连接。在动态链接中,可执行文件只包含对库函数的引用,而不包含实际的库函数代码和数据。当程序运行时,动态链接器会在系统中搜索并加载所需的库文件,并建立程序与库文件之间的链接关系。动态链接的优点是可执行文件的体积较小,多个程序可以共享同一个库文件,但缺点是程序在运行时需要依赖外部的库文件。

/usr/lib 和 /usr/local/lib

/usr/lib:这是系统级别的库路径,用于存放系统安装的共享库文件。这些库文件是由操作系统或软件包管理器安装的,供系统中的各种程序使用。通常,这些库文件是与操作系统版本和发行版相关的。

/usr/local/lib:这是本地级别的库路径,用于存放用户自己安装的共享库文件。当用户从源代码编译并安装软件时,通常会将其安装在/usr/local目录下。因此,相关的库文件也会被安装在/usr/local/lib路径下

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

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

相关文章

软件测试指南

软件测试指南 软件集成测试软件系统测试&#xff08;功能性测试&#xff0c;性能测试&#xff09;

dp中最短编辑距离的笔记(分析dp)

dp分析往往就是看最后一步的变化。 分析&#xff1a; 设a串长度为i&#xff0c;b串长度为j。题目要求为通过三种操作将a字符串转化为b字符串的最少次数。 删除操作&#xff1a; 把a[i]删除后a[1~i]和b[1~j]匹配&#xff0c;所以可以得到f[i - 1][j] 1&#xff0c;在此之前要先…

ce从初阶到大牛--grep篇

1、显示/etc/rc.d/rc.sysinit文件中以不区分大小的h开头的行&#xff1b; grep -i "^h" /etc/rc.d/rc.sysinit2、显示/etc/passwd中以sh结尾的行; grep "sh$" /etc/passwd3、显示/etc/fstab中以#开头&#xff0c;且后面跟一个或多个空白字符&#xff0c;…

烦躁的广告弹窗如何在 Edge 上消失?轻松招架 3 种方法

Edge问题解决教程之广告弹窗如何消失&#xff1f; 一、前言&#xff1a;广告弹窗问题二、使用Edge浏览器内置的广告拦截功能三、安装广告拦截浏览器扩展程序四、处理恶意软件和广告弹窗网站五、总结 一、前言&#xff1a;广告弹窗问题 Edge浏览器中出现的广告弹窗问题是由恶意…

Android 动画 Lottie 如何使用

Android 动画 Lottie 如何使用 一、简介 Lottie 是Airbnb开源的一个面向 iOS、Android、React Native 的动画库&#xff0c;能分析 Adobe After Effects 导出的动画&#xff0c;并且能让原生 App 像使用静态素材一样使用这些动画&#xff0c;完美实现动画效果。 二、Lottie动…

openwrt中taiscale自动安装脚本详解

openwrt中taiscale自动安装脚本详解 一、代码仓库地址 https://github.com/adyanth/openwrt-tailscale-enabler 二、代码仓库中脚本文件详解 主要包含三个脚本分别是etc/init.d/tailscale、usr/bin/tailscale、usr/bin/tailscaled &#xff0c;接下来逐个分析一下脚本中的具…

数字孪生Web3D智慧机房可视化运维云平台建设方案

前言 进入信息化时代&#xff0c;数字经济发展如火如荼&#xff0c;数据中心作为全行业数智化转型的智慧基座&#xff0c;重要性日益凸显。与此同时&#xff0c;随着东数西算工程落地和新型算力网络体系构建&#xff0c;数据中心建设规模和业务总量不断增长&#xff0c;机房管理…

【深度学习目标检测】九、基于yolov5的安全帽识别(python,目标检测)

YOLOv5是目标检测领域一种非常优秀的模型&#xff0c;其具有以下几个优势&#xff1a; 1. 高精度&#xff1a;YOLOv5相比于其前身YOLOv4&#xff0c;在目标检测精度上有了显著的提升。YOLOv5使用了一系列的改进&#xff0c;如更深的网络结构、更多的特征层和更高分辨率的输入图…

“四十不纵欲,五十不纵情,六十不纵……”这三样东西,影响一生

著名文豪曹植曾在诗作中写道&#xff1a;“清时难屡得&#xff0c;嘉会不可常。天地无终极&#xff0c;人命若朝霞。” 天地之悠悠无穷无尽&#xff0c;而人生之寿命短如晨霜稍纵即逝&#xff0c;几十年时光也不过是弹指一挥间。 纵使曾经怀有豪情万丈&#xff0c;总饱含凌云…

HarmonyOS给应用添加消息通知

给您的应用添加通知 通知介绍 通知旨在让用户以合适的方式及时获得有用的新消息&#xff0c;帮助用户高效地处理任务。应用可以通过通知接口发送通知消息&#xff0c;用户可以通过通知栏查看通知内容&#xff0c;也可以点击通知来打开应用&#xff0c;通知主要有以下使用场景…

MY SQL数据库系统

一、认识MY SQL&#xff1a; MySQL是-个真正的多线程&#xff0e;多用户的SQL 数据库服务&#xff0e;凭借其高性能、高可靠和易于使用的特性.成为服务器领域中最受欢迎的开源数据库系统。在2008年以前&#xff0c;MySQL项目由MySaLAB公司进行开发、发布和支持&#xff0c;之后…

【精选】计算机网络教程(第1章计算机网络概述)

目录 前言 第1章计算机网络概述 1、计算机网络的分类 2、典型的网络交换方式主要分为两种 3、计算机网络体系结构——原理体系结构 结语 前言 总结计算机网络教程课程期末必记知识点。 第1章计算机网络概述 1、计算机网络的分类 按网络的覆盖范围进行分类 局域网&#xf…

Linux---文本搜索命令

1. grep命令的使用 命令说明grep文本搜索 grep命令效果图: 2. grep命令选项的使用 命令选项说明-i忽略大小写-n显示匹配行号-v显示不包含匹配文本的所有行 -i命令选项效果图: -n命令选项效果图: -v命令选项效果图: 3. grep命令结合正则表达式的使用 正则表达式说明^以指…

部署LVS的NET模式

实验准备 #负载调度器# 192.168.116.40 #内网 12.0.0.100 #外网 先添加双网卡 #web服务器# 192.168.116.20 #web1 192.168.116.30 #web2 #nfs共享服务# 192.168.116.10 #nfs systemctl stop firewalld setenforce 0 1.nfs共享文件 1…

Unity 常用资料

1. Layer layer本质是按序左移的一个Int32数字&#xff0c;int32有4个字节》32位&#xff0c;故可以支持32个层级。系统自身使用了5个层&#xff0c;意味着用户还有27个层可以使用。 0000 0000 0000 0000 0000 0000 0000 0000 可以且只能任意位为1。unity具体的0-31的层级分布…

【观测宇宙】

这个网站一眼看清整个宇宙。可观测范围一亿光年。 Cocosmos | 掌上宇宙 作者开发介绍&#xff1a;Cocosmos 序章 | 掌中宇宙&#xff0c;浩瀚星海&#xff0c;一眼万年 (qq.com)

HPM6750系列--第十篇 时钟系统

一、目的 上一篇中《HPM6750系列--第九篇 GPIO详解&#xff08;基本操作&#xff09;》我们讲解了HPM6750 GPIO相关内容&#xff0c;再进一步讲解其他外设功能之前&#xff0c;我们有必要先讲解一下时钟系统。 时钟可以说是微控制器系统中的心脏&#xff0c;外设必须依赖时钟才…

Java反序列化漏洞-CC1利用链分析

文章目录 一、前置知识1. 反射2. Commons Collections是什么3. 环境准备 二、分析利用链1. Transformer2. InvokeTransformer执行命令 3. ConstantTransformer4. ChainedTransformer执行命令 5. TransformedMap6. AbstractInputCheckedMapDecorator7. AnnotationInvocationHand…

软件设计师——数据结构(一)

&#x1f4d1;前言 本文主要是【数据结构】——软件设计师——数据结构的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304…

基于Python数据可视化的网易云音乐歌单分析系统

目录 《Python数据分析初探》项目报告 基于Python数据可视化的网易云音乐歌单分析系统一、项目简介&#xff08;一&#xff09;项目背景&#xff08;二&#xff09;项目过程 二、项目设计流程图&#xff08;一&#xff09;基于Python数据可视化的网易云音乐歌单分析系统的整体…