DLL运行逻辑和Lib文件之间的关系
我正在尝试了解 Windows 中 DLL 的运行时逻辑。我知道在编译阶段,我只需要提供lib文件和DLL导入头文件,但是我不太明白程序和编译器是如何知道DLL的名称的。我发现有信息说lib文件没有记录DLL名称。我尝试更改lib文件的名称,程序仍然能够找到必要的DLL。但是,当我修改DLL名称时,程序报告找不到“name.DLL”。我不明白程序如何知道它需要链接到哪个 DLL 名称。 lib文件里有记录吗?
// EXE
#include <iostream>
#include "mylib.h"
#pragma comment(lib,"C:\\Users\\Administrator\\source\\repos\\ConsoleApplication1\\ConsoleApplication1\\DLLTEST\\123.lib")
int main()
{
std::cout << Add(1, 2);
}
// mylib.h
#pragma once
#ifndef MYLIB_H
#define MYLIB_H
// MYLIB_EXPORTS should only be defined when building the DLL
#ifdef TESTDLL_EXPORTS
#define MYLIB_API __declspec(dllexport)
#else
#define MYLIB_API __declspec(dllimport)
#endif
extern "C" MYLIB_API int Add(int a, int b);
#endif // MYLIB_H
在 Windows 中,DLL 实际上是一个可执行文件。因此,DLL 的全局数据将在所有使用它的应用程序之间共享。 Windows 有许多系统函数可以获取导出函数的地址。
在运行时,导入lib文件充当中继:它负责查找导出函数的地址,然后对静态链接lib文件函数进行的所有调用都将中继到DLL函数。
这解释了为什么 lib 文件的名称并不重要,而 DLL 文件的名称是:lib 必须能够找到其同伴 DLL。