动静链接库(Windows篇)

以前学习过Python调用dll,所以就把动态链接库和静态链接库的知识学习了一遍。针对之前学习,加上自己的理解,写一篇能够实践的记叙文。

写在前面

阅读关于动态链接库和静态链接库的基础资料,实践后如果遇到了问题,可以看看本文。希望对你有所帮助,:)

系统:Windows
编程工具:Visual Studio

动态库

生成动态库dll时,会有两个文件lib文件和dll文件。在使用dll时,有两种方式

使用lib和h文件

  1. 配置visual studio的附加包含目录、附加库目录、附加依赖项,让编译器能够找到.h和.lib文件
  2. 在编写代码时候,包含.h文件,之后一切的写法就像“不用加载dll”时一样
  3. 生成了exe,将dll文件和exe文件放在同一个目录,不用管.lib文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
附加依赖项的是.lib 不是.dll 
若生成了DLL ,则肯定也生成 LIB文件

如果要完成源代码的编译和链接,有头文件和lib就够了。
如果要使动态连接的程序运行起来,有dll就够了。
在开发和调试阶段,当然最好都有。

.h .lib .dll三者的关系是:

H文件 作用是:声明函数接口
DLL文件 作用是: 函数可执行代码
当我们在自己的程序中引用了一个H文件里的函数,编链器怎么知道该调用哪个DLL文件呢?

这就是LIB 文件的作用: 告诉链接器 调用的函数在哪个DLL中,函数执行代码在DLL中的什么位置
这也就是为什么需要 附加依赖项 .LIB文件 ,它起到桥梁的作用。


最后已经生成exe了,自然就不需要.lib文件

(本段摘录于某个博客,但是忘记保存其博客链接,特意说明)

仅仅使用dll

  1. 使用加载dll的函数,直接加载这个dll,如LoadLibrary,GetProcAddress等
  2. 最后使用时,dll文件和exe文件在同一个目录

静态库

生成静态库时,仅仅有.lib文件,没有dll文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
如果生成静态库文件,则没有DLL ,只有lib,这时函数可执行代码部分也在lib文件中 

目前以lib后缀的库有两种,一种为静态链接库 (Static Libary,以下简称“静态库”),
另一种为动态连接库(DLL,以下简称“动态库”)的导入库 (Import Libary,以下简称“导入库”)。

静态库是一个或者多个obj文件的打包,所以有人干脆把从obj文件生成lib的过程称为Archive,即合并到一起。比如你链接一个静态库,如果其中有错,它会准确的找到是哪个obj有错,即静态lib只是壳子。

动态库一般会有对应的导入库,方便程序静态载入动态链接库,否则你可能就需要自己LoadLibary调入DLL文件,然后再手工GetProcAddress获得对应函数了。有了导入库,你只需要链接导入库后按照头文件函数接口的声明调用函数就可以了。

导入库和静态库的区别很大,他们实质是不一样的东西。静态库本身就包含了实际执行代码、符号表等等

而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息

(本段摘录于某个博客,但是忘记保存其博客链接,特意说明)
  1. 配置visual studio的附加包含目录、附加库目录、附加依赖项,让编译器能够找到.h和.lib文件
  2. 编写代码时,包含头文件后,正常写代码
  3. 生成exe文件,直接发布就好。不用把.lib文件和exe文件一起发布

写在后面

博客恢复更新,争取继续写点有用的文章


参考资料

lib 和 dll 的区别、生成以及使用详解 - tenos - 博客园
为何Windows下的动态库总伴随一个静态库?

您的支持将鼓励我继续创作!