Windows 链接器是否使用 LoadLibrary 解析 DLL 中未定义的符号?

Does Windows linker resolve undefined symbols in DLL with LoadLibrary?

本文关键字:DLL 未定义 符号 解析 LoadLibrary 链接 是否 Windows      更新时间:2023-10-16

在 Linux 中,当我使用可执行文件(或共享库(中的dlopen()加载共享库时,我希望这个库中未定义的符号将被自动解析,当然只要可执行文件(或共享库(定义了这些符号。

例如,我有库A,其中包含以下头文件和源文件:

#pragma once
int funcA();
#include "A/header.h"
int funcA() {}

我也有带有此源文件的库B

#include "A/header.h"
void funcB() {
funcA();
}

对于库B,我指定了库 A 标头的路径,但我没有将库A链接到库B

在这种情况下,如果我通过调用库 A 从库A加载库 Bdlopen(),那么库 B 中未定义的符号funcA将被解析,因此库B将能够调用funcA

Windows也是如此,还是我必须手动查找我需要的所有符号的地址?

在研究了已经回答的关于堆栈溢出的问题之后:

  • 在 dll 中解析外部符号
  • 使用 MinGW 编译为带有一些未定义引用的.dll

我意识到,如果我想在Windows上做类似的事情,我必须为我的共享库A创建一些导入库

起初我认为它只适用于 MSVC,但看起来 MinGW 也需要导入库,因为这是 Windows 上的工作方式。如果我错过了什么,请纠正我。

对我来说,这是一个很大的禁忌,所以可能会改变我使用共享库的方式,通过附加接口显式检索我需要的每个符号。幸运的是,它们并不多。