首页 > 系统相关 >Windows环境下的静态库和动态库介绍

Windows环境下的静态库和动态库介绍

时间:2023-09-23 16:44:21浏览次数:43  
标签:文件 exe lib Windows dll 静态 动态 入库

目录

一、简介

  在Windows系统下常见的库有两种一种是以.lib为扩展名的库,也叫lib库。lib库实际上分为两种:一种是静态链接lib库或者叫做静态lib库,另一种是动态链接库dll库的lib导入库或称为lib导入库。以dll为扩展名的库叫dll库,dll库只有一种就是用于动态链接的动态链接库(也叫dll库,dll是:dynamic link library的英文单词首字母缩写)。在发展史上,动态链接库的出现晚于静态链接库的出现。

二、lib库的详细说明

静态lib库

  静态lib库,包含了所有的代码实现的,是源代码文件.c或.cpp文件编译生成的,这个lib库就是文本形式的源代码编译后的二进制形式代码。

lib导入库

  lib导入库,这个库里只是相应的dll文件中的所有函数在dll文件中的地址的说明。也就是这个lib导入库里没有函数的具体实现,只是对相应的dll文件的说明。
  也就是说目前以.lib为后缀的库有两种,一种为静态链接库(static library,简称“静态库”),另一种为动态链接库(DLL,简称“动态库”)的导入库(import library)。

两种库的说明

  从两种库的说明可以看出,静态lib库文件里是包含了所有的代码的,所以只要导入后,使用链接器链接生成exe文件后,那么exe文件就可以直接使用exe 内部的代码了。这个静态链接lib库的过程就相当于把静态lib库里的所有二进制的代码复制到exe文件中。所以,链接完后,静态lib库文件就不需要了。最后, 我们只要exe就行了。这个lib在链接完后,就已经失去价值了。只有下次再编译生成exe文件时,才再此需要。发版时,只提供给别人exe就行,不需要提供静态lib库。缺点是导致exe文件太大。每次修改静态lib库文件里的代码,都需要重新编译生成新的exe文件。优点是:依赖性小。小的应用程序,适用使用静态lib库,大的应用程序不适合使用静态lib库。
  lib导入库可以说明相应的dll库的内部结构,简直就对dll内部了如指掌,我们通过lib导入库,再把相应的dll文件放到合适的位置(这个再后面再说具体放到哪里),程序运行时,就可以轻松调用到dll里面的函数。

两种lib库的相同点和不同点

  相同点:两种lib都是用于编译的链接阶段,都把自身的内容复制拷贝到exe文件内,在正确生成exe后,两种lib库的使命也就完成了。也就是说后续运行exe程 序,就用不到了(即程序的运行阶段)。这里要说明一下,虽然lib导入库中不存在函数的具体实现,但是其里面有函数具体在哪个dll文件中的说明。那么在源代码生成的目标文件,在链接阶段,通过在lib导入库文件中,查到相应的外部函数的实现在对应的dll文件中的地址说明,也就保证链接阶段的正确通过,而其相应的具体的dll文件并不参与整个编译的阶段,而是在程序运行阶段才实际需要到,真正的实现了说明和实现的分离。
  不同点:静态库是一个或者多个.obj目标文件的打包,静态库只是一个“壳子”,静态库报错的话,会定位到某个.obj目标文件。静态库和导入库的区别很大,他们本质是不一样的东西。静态库本身就包含了实际执行代码、符号表等;而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。

三、visual studio静态lib库导出和使用

https://blog.csdn.net/adminstate/article/details/130308630

标签:文件,exe,lib,Windows,dll,静态,动态,入库
From: https://www.cnblogs.com/hhddd-1024/p/17724638.html

相关文章

  • windows系统编程(win32)
    一、编程环境操作系统:windows10-1809(17763.1557)-x64;windowskits:C:\ProgramFiles(x86)\WindowsKits\10\Include\10.0.19041.0\sharedvisualstudio2019:C:\ProgramFiles(x86)\MicrosoftVisualStudio\2019\Community\VC\Tools\MSVC\14.29.30133\include......
  • 动态规划 题单总结
    目录P7339『MdOIR4』KotoriP2167[SDOI2009]Bill的挑战P4206[NOI2005]聪聪与可可P4377[USACO18OPEN]TalentShowGP4766[CERC2014]OuterspaceinvadersP8564ρars/eyP7339『MdOIR4』Kotori考虑直接思考对于分成\(\frac{n}{2}\)组构成的所有的树。很显然这是一颗完......
  • Windows 安装 Rust
    1、安装rustup-init.exehttps://www.rust-lang.org/zh-CN/tools/install1、安装rustup-init.exehttps://www.rust-lang.org/zh-CN/tools/installwindows安装Rust安装太慢解决办法1、打开powershell2、分别执行下面两行代码:$ENV:RUSTUP_DIST_SERVER='https://mirrors.......
  • 代码随想录算法训练营-动态规划-1|509. 斐波那契数、70. 爬楼梯
    509. 斐波那契数 1classSolution:2deffib(self,n:int)->int:3ifn<=2:4returnn56prev1,prev2=0,17for_inrange(2,n+1):8sum_value=prev1+prev29prev1,......
  • Windows 删除 curl 别名
    D:/github/deno_core_live>cargocheckwarning:versionrequirement`0.12.3+zstd.1.5.2`fordependency`zstd`includessemvermetadatawhichwillbeignored,removingthemetadataisrecommendedtoavoidconfusionwarning:versionrequirement`0.12.3+zs......
  • Linux用g++编译生成动态连接库.so的方法及连接
    Linux动态库默认搜索路径/lib64、/usr/lib64、/lib、/usr/lib系统头文件目录/usr/include常用命令lddmain:查看二进制可执行文件链接的动态链接库信息,例如lddnginxg++-cmain.cpp:以单个xx.cpp源文件为单位只编译出xx.o的二进制文件(称为:目标文件)g++xx.oyy.o-oma......
  • Python分享之动态类型
    动态类型(dynamictyping)是Python另一个重要的核心概念。我们之前说过,Python的变量(variable)不需要声明,而在赋值时,变量可以重新赋值为任意值。这些都与动态类型的概念相关。动态类型在我们接触的对象中,有一类特殊的对象,是用于存储数据的。常见的该类对象包括各种数字,字符串,表,词......
  • Windows 消息机制
    目录Windows和消息消息和消息队列Windows消息类型Windows系统的整个消息系统分为3个层级Q&AWinForm程序中消息处理的相关方法其他代码片段相关参考Windows和消息消息和消息队列名称说明消息和消息队列本部分介绍消息和消息队列,以及如何在应用程序中使用它们。......
  • gcc 使用 与 选项 编译动态库
    问题:-Wl,-rpath,/path/to/shared/lib将-rpath选项传递给链接器,告诉链接器在运行时搜索共享库时要搜索指定的路径/path/to/shared/lib与使用-L指定lib路径有区别吗 是的,-Wl,-rpath和-L选项在链接器中有不同的作用和用途:-L选项:用于指定在链接过程中搜索库文件的路径。......
  • 学不会的动态规划——状压DP
    前言不知道为什么越是接近网络赛就越是静不下心来,可能也是因为开学了吧,QAQ,有一说一还是暑假比较适合训练。第一场网络赛,特意选了一个属于我们队的“风水宝地”(其实是我们去的早获得了优先选择权),但是好像并没有什么用,读题读巨慢,还被签到卡了2h(大概,有点不记得了),最后开j,队友推公式写......