动态与静态函数库的的使用 和 区别 及 优缺点

news/2024/11/1 15:23:35/

这里写目录标题

  • 初识静态库与动态库
    • 静态函数库
    • 动态函数库

初识静态库与动态库

静态函数库与动态函数库的使用中,有人也把他称为程序的静态链接及动态链接
静态链接:指程序链接时使用静态库的链接方式,把所有需要的库函数加入(拷贝)到了可执行程序当中。

动态链接:指程序链接时使用动态库的链接方式,在编译链接时,只把所需库函数的指针保存在了可执行程序中,在运行时再通过指针找到所需库函数。

静态函数库:程序在链接时,已经把所有所有需的库函数加入(拷贝)到了可执行程序当中,由于加入了库函数所以生成的文件会比较大。但优点是运行时不再需要调用外部库函数了。
在这里插入图片描述
动态函数库库:与静态库相反,程序在链接时,只把所需库函数的指针保存在了可执行程序中,在运行时再通过指针找到所需库函数。优点是这样生成的文件比较小,但是使用动态库函数的可执行程序是不能独立运行的,需要依赖外部的动态库
在这里插入图片描述

静态函数库

这类函数库在编译的时候会直接整合到执行程序当中,所以利用静态函数库编译成的文件会比较大一些

如下图同一段代码使用动态函数库编译出来的可执行程序大小为 8384 ,而使用静态函数库编译的可执行程序 大小为 861240
在这里插入图片描述
在不知情的情况下如何查看文件采用何种函数库(链接方式)
命令:file 文件名
作用:查看文件链接方式
操作如下:
在这里插入图片描述

优点:虽然使用静态函数库的可执行程序文件大小比较大,但是这类可执行程序能独立运行,不需要依赖外部函数库。

缺点:虽然执行文件能独立运行,但因为函数库是直接整合到文件中的,所以要升级更改函数库时,整个执行文件必须要重新编译才能将新版的函数库整合到程序中,这就比较消耗时间。

动态函数库

程序如果使用动态函数库(动态链接),在程序中只保存了函数库中的函数指针而已。也就是说,动态函数库的内容并没有被整合到可执行文件中,而是当程序要使用函数库相关函数时,程序才会通过函数指针找到该函数并使用。 所以由于可执行程序只保存了函数库中函数的指针,并不包含内容,所以他所形成的文件会小很多。

优点 :虽然这类程序不能独立运行,然而其文件中的函数指针具有指向性,所以当函数库中的函数升级后,执行文件根本不需要重新编译,因为可执行文件会依然指向升级后的函数。(新旧版本的函数库文件名及函数名需相同)

缺点:程序不能独立运行,程序所依赖的函数库不能随意删除或移动,会影响依赖他的程序。

拓展:目前的Linux发行版比较倾向于使用动态函数库,因为如同上面提到的最重要的一一点,就是函数库的升级方便。由于Linux系统里面的软件依赖性太复杂了,如果使用太多的静态函数库,那么升级某一个函数库时,就会对整个系统造成很大的冲击。因为其他依赖的执行文件也要同时重新编译,这个时候动态函数库可就有用多了,因为只要动态函数库升级就好,其他的软件根本无须变动。


http://www.ppmy.cn/news/20201.html

相关文章

爬楼梯(Python)

Python——动态规划——爬楼梯问题 爬楼梯问题 问题引入 【问题描述】 假设小明住在二楼,每次回家都需要经过一个有n层台阶的楼梯。小明每次可以选择一步走一级台阶或者一步走两级台阶。请计算一下小明从楼下到家一共有多少种走法? 【输入形式】 整数n,表示一共有几层台阶 …

信用卡数字识别

信用卡数字识别一、读入模板图像二、数字模板图像处理1、模板图像预处理1.1、转换为灰度图1.2、转换为二值化图像2、轮廓处理2.1、计算轮廓2.2、画出轮廓2.3、对轮廓从左到右排序并储存3、轮廓遍历3.1、获取轮廓参数3.2、计算轮廓外接矩形3.3、resize成合适大小3.4、存储外接矩…

后端校验(hibernate-validator)

目录一、介绍和依赖二、方法的 Model 参数校验三、方法的非 Model 参数校验四、常用注解五、快速失败六、自定义校验规则一、介绍和依赖 hibernate-validator 是 Java 中常用的后端校验框架 https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/【…

Windows中常用的网络排错命令

ping,ipconfig,route,arp,tracert,netstat, telnet常用命令及参数的操作 ping命令 应用场景:用于解决连接、可访问性和名称解析问题。 用法: ping 域名/IP地址 [参数] (如: pi…

【自然语言处理】【分布式训练及推理】推理工具DeepSpeed-Inference

相关博客 【自然语言处理】【分布式训练及推理】推理工具DeepSpeed-Inference 【自然语言处理】【chatGPT系列】大语言模型可以自我改进 【自然语言处理】【ChatGPT系列】WebGPT:基于人类反馈的浏览器辅助问答 【自然语言处理】【ChatGPT系列】FLAN:微调…

Android Studio实现志愿者系统

项目目录一、项目概述二、主要技术三、开发环境四、详细设计1、基础Activity2、活动信息3、成员信息4、百度地图5、Widget组件五、运行演示一、项目概述 本系统采用MVC架构设计,SQLite数据表有用户表、成员表和活动表,有十多个Activity页面。打开应用&a…

如何用Spring整合MyBatis和Junit

Spring整合MyBatis和Junit一. 整合MyBatis1. 目录:2. pom.xml:3. domain层:4. dao层:5. service层:AccountService接口类:AccountServiceImpl实现类:6. jdbc.properties配置文件:7. …

Day14 基于AOP的声明式事务控制

1 Spring 事务编程概述PlatformTransactionManager TransactionDefinition TransactionStatus2 搭建环境数据库准备一个账户表tb account;dao层准备一个AccountMapper,包括incrMoney和decrMoney两个方法;service层准备一个transferMoney方法,分别调用in…