我能想到几个原因。
- 使用 .lib 文件意味着您可以构建与系统上不同版本的 DLL,只要您安装了正确的 SDK。
- 编译器和链接器需要支持跨平台编译 - 您可能在 32 位平台上为 64 位目标构建,反之亦然,并且不存在正确的体系结构 DLL。
- .lib 文件使您能够“隐藏”您的实现的某些部分 - 您可以拥有不显示在 .lib 中但可以通过 GetProcAddress 发现的私有导出。您还可以进行序号导出,在这种情况下,它们没有导出的友好名称,但在 .lib 中会有一个友好名称。
- 本机 DLL 没有强名称,因此可能会选择错误的 DLL 版本。
- 最重要的是,这项技术是在 1980 年代设计的。如果它是今天设计的,它可能更接近您所描述的 - 例如,.NET 您只需要引用目标程序集并且您拥有使用它所需的一切。
我不知道有什么方法可以单独使用 DLL 进行隐式链接 - 快速搜索发现了几个工具,但我没有使用过其中任何一个。
在这种情况下,我将创建一个包含您需要使用的函数的单独源文件,并根据需要动态加载 DLL 并绑定它们。例如:
// using global variables and no-error handling for brevity.
HINSTANCE theDll = NULL;
typedef void (__stdcall * FooPtr)();
FooPtr pfnFoo = NULL;
INIT_ONCE initOnce;
BOOL CALLBACK BindDLL(PINIT_ONCE initOnce, PVOID parameter, PVOID context)
{
theDll = LoadLibrary();
pfnfoo = GetProcAddress(dll, "Foo");
return TRUE;
}
// Export for foo
void Foo()
{
// Use one-time init for thread-safe lazy initialization
InitOnceExecuteOnce(initOnce, BinDll, NULL, NULL)
pfnFoo();
}