我正在考虑将 Lua 合并到 C++ 项目中,并且对 Luabinaries 的发行版中存在两个二进制文件(lua51.dll 和 lua5.1.dll)感到有些困惑。
根据文档...
在 Windows 中,您的库或应用程序必须与存根库链接。存根库是仅包含将您的 DLL 与 Lua DLL 绑定的函数声明的库。
为什么?在与第三方 DLL 链接之前,我从来不需要存根 DLL?
存根库是一个.lib
文件,而不是 DLL。它包含 DLL 中所有导出函数的函数声明,它只是将调用转发到 DLL 本身。因此,如果您构建一个要链接的应用程序lua51.dll
,您告诉链接器链接lua51.lib
,所有对导出函数的调用都将转发到 DLL。如果不这样做,链接时会出现很多“未解析的外部符号”错误。
这仅在与 DLL 静态链接时需要(以便在应用程序运行时自动加载)。动态加载 DLL 时不需要LoadLibrary
.
关于他们为什么有两个不同的DLL,手册说:
LuaBinaries DLL 包有一个名为“lua51.dll”的 dll 代理。它可以用来替换其他发行版发布的其他“lua51.dll”。它只会将调用转发到“lua5.1.dll”。转发中不涉及编译的源代码。
基本上,一些现有的应用程序链接,lua5.1.dll
而另一些链接,lua51.dll
他们希望同时支持它们。无论如何,这与存根库无关。
我相信这与 __declspec(import) 和 __declspec(export) vs GetProcAddress 有关。但是,我实际上并不确定。