去年校招在美的面试时,emmm,被问倒了。 Dll基本的部分本事不太复杂,真需要静下心来,细细研究这方面的知识。
——以不变应万变!
update 2019/11/14: 从主要目的来看,这个构建和导入的过程,核心是通过编译产生二进制文件,并在软件启动时加载到内存中,其中内存里存放了dll相关函数的转跳地址。需要使用时,通过汇编的转跳指令转跳到相关函数上,本质上和普通的函数调用时没有任何区别的,windows仅仅对其进行了一层封装,便于软件层面的开发和管理。
-
DLL构建
-
*.h头文件编写,包含:函数原型、数据结构、符号
-
*.cpp源文件--->实现头文件中定义的功能
-
由源文件生成一 一对应的*.obj文件
-
链接器合并obj文件产生独立DLL文件,文件包含:二进制代码、全局及静态变量
-
若DLL中有函数或变量,链接器生成一个*.lib文件,包含:函数和变量符号名
-
-
构建可执行模块
-
取出上文构建DLL时使用的*.h头文件和DLL文件
-
通过.h引用函数、变量
-
源文件产生obj文件
-
合并所有obj文件,产生exe文件,其中包含:
-
二进制代码
-
全局及静态变量
-
导入段(所需DLL名称)
-
引用函数+变量名
-
-
执行exe文件
-
加载至虚拟地址空间
-
可执行模块载入
-
导入段定位
-
主进程运行
-
-
-
答疑:
Q: 为什么有时候.h和.dll都配置好了,但是在编译的时候会报“××××无法解析的外部符号”呢?
A: 链接器需通过*.lib文件来确定DLL的导出符号(函数、变量名),若没有在*.lib文件中找到就会报此错误。