首页 > 其他分享 >静态库与动态库的使用

静态库与动态库的使用

时间:2024-06-19 17:57:18浏览次数:19  
标签:可执行文件 函数库 静态 编译 使用 动态 加载

一、什么是库

库是写好的,现有的,成熟的,可以复用的代码。本质上来说,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)。所谓静态、动态是指链接。

库文件是事先编译好的方法的合集。

二、静态库与动态库的区别

1、静态库的扩展名一般为“.a”或“.lib”;动态库的扩展名一般为“.so”或“.dll”。

2、静态库在编译时会直接整合到目标程序中,编译成功的可执行文件可独立运行;动态库在编译时不会放到连接的目标程序中,即可执行文件无法单独运行。

静态库和动态库最本质的区别就是:该库是否被编译进目标(程序)内部。

静态(函数)库
一般扩展名为(.a或.lib),这类的函数库通常扩展名为libxxx.a或xxx.lib 。

这类库在编译的时候会直接整合到目标程序中,所以利用静态函数库编译成的文件会比较大,这类函数库最大的优点就是编译成功的可执行文件可以独立运行,而不再需要向外部要求读取函数库的内容;但是从升级难易度来看明显没有优势,如果函数库更新,需要重新编译。

动态(函数)库
动态函数库的扩展名一般为(.so或.dll),这类函数库通常名为libxxx.so或xxx.dll 。

与静态函数库被整个捕捉到程序中不同,动态函数库在编译的时候,在程序里只有一个“指向”的位置而已,也就是说当可执行文件需要使用到函数库的机制时,程序才会去读取函数库来使用;也就是说可执行文件无法单独运行。这样从产品功能升级角度方便升级,只要替换对应动态库即可,不必重新编译整个可执行文件。

三、静态库与动态库优缺点

1、静态库优点:

①静态库被打包到应用程序中加载速度快
②发布程序无需提供静态库,移植方便

缺点:

①相同的库文件数据可能在内存中被加载多份,消耗系统资源,浪费内存
②库文件更新需要重新编译项目文件,生成新的可执行程序,浪费时间。

2、动态库优点:

①可实现不同进程间的资源共享
②动态库升级简单,只需要替换库文件,无需重新编译应用程序
③可以控制何时加载动态库,不调用库函数动态库不会被加载                                                       

缺点:

①加载速度比静态库慢
②发布程序需要提供依赖的动态库

四.编译的过程

1. 静态库制作过程

 2.动态库制作过程

 五.静态库和动态库的调用

标签:可执行文件,函数库,静态,编译,使用,动态,加载
From: https://blog.csdn.net/2301_80655427/article/details/139809431

相关文章

  • 国产linux系统(银河麒麟,统信uos)使用 PageOffice 国产版在线打开 pdf 文件
    PageOffice国产版:支持信创系统,支持银河麒麟V10和统信UOS,支持X86(intel、兆芯、海光等)、ARM(飞腾、鲲鹏、麒麟等)芯片架构。查看本示例演示效果本示例关键代码的编写位置Vue+Springboot注意本文中展示的代码均为关键代码,复制粘贴到您的项目中,按照实际的情况,例如文档路径,用户名......
  • 如何使用JavaScript实现在线Excel附件的上传与下载?
    前言在本地使用Excel时,经常会有需要在Excel中添加一些附件文件的需求,例如在Excel中附带一些Word,CAD图等等。同样的,类比到Web端,现在很多人用的在线Excel是否也可以像本地一样实现附件文件的操作呢?答案是肯定的,不过和本地不同的是,Web端不会直接打开附件,而是使用超链接单元格的......
  • 在Vue 2中使用Swiper,你需要安装与Vue 2兼容的Swiper版本
    在Vue2中使用Swiper,你需要安装与Vue2兼容的Swiper版本,并且通常还需要安装vue-awesome-swiper这个Vue组件来更方便地集成Swiper。以下是如何在Vue2项目中使用Swiper的步骤:1.安装Swiper和vue-awesome-swiper首先,你需要通过npm或yarn来安装Swiper和vue-awesome-swiper。确保安......
  • sql判断NULL值:IF()、IFNULL()、NULLIF()、ISNULL()函数的区别使用
    IF()函数         IF(expr1,expr2,expr3),如果expr1的值为true,则返回expr2的值,如果expr1的值为false,则返回expr3的值。            SELECTIF(TRUE,'1','0');    --1            SELECTIF(FALSE,'1','0');   --0I......
  • java内置的函数式接口介绍及使用举例
    lambda表达式的本质:作为函数式接口的实例如果在一个接口中,只声明了一个抽象方法,则此接口就被称为函数式接口,我们可以在一个接口上使用,@FunctionalInterface注解来验证该接口是否为函数式接口(吐过在该接口中写两个方法,则会编译失败)正是因为抽象方法中只有一个方法,所以我们才可以......
  • css如何动态累计数字?
    导读:css如何动态累计数字?用于章节目录的序列数生成,用css的计数器实现起来比js方式更简单!伪元素::after::before伪元素设置content可以在元素的首部和尾部添加内容,我们要在元素的首部添加序列号,所以要用到的是::before的content属性计数器counter-reset初始化或重置......
  • 使用VLAN,实现网络间的安全隔离,竟用Cisco Packet Tracer Student 6.2 模拟实现?
    需求说明:某企业网络未扩建前经常有网络不稳定的情况,想通过升级改造对网络在逻辑上进行安全隔离,来保证网络有效稳定运行。技术部和市场部各有计算机10台,所有计算机通过双绞线连接到交换机上,IP地址也在同一网段。企业负责人要求在不改变现有网络连接方式及IP地址的情况下,将两个......
  • 使用Gunicorn部署django项目
    安装pipinstallgunicorn配置配置Gunicorn的systemd服务文件创建Gunicorn服务文件:sudovim/etc/systemd/system/gunicorn.service添加以下内容到服务文件:[Unit]Description=gunicorndaemonAfter=network.target[Service]User=youruserGroup=www-dataWorki......
  • 关于netty 一些使用细节
    netty的客户端通常是websoket  但是为了演示也可以用netty做客户端,Channel:可以被理解为数据传输的通道。Pipeline:可以被视为一个由多个工序组成的流水线,负责将数据(事件)传递给流水线上的每个处理工序(handler)。Msg:指的是在流水线上流动的数据。最初输入的数据通常是ByteBuf......
  • 从0到1使用vite搭建react项目保姆级教程(持续更新中)
    一、vite创建react项目要使用Vite创建一个React项目,你需要按照以下步骤操作:1、确保你已经安装了Node.js(建议使用最新的稳定版本)。2、使用npm命令安装ViteCLI工具,再来创建项目npmcreatevite@latestmy-vite-app 3、运行上述命令后,按照提示选择“create-react-app”......