了解静态链接嵌入式 lua 环境中的 lua 扩展 dll building/loading

Understanding lua extension dll building/loading in statically linked embedded lua environment

我有一个相对复杂的 lua 环境,我正在尝试了解以下 would/could 是如何工作的。启动设置包括以下两个模块:

dll 加载到主应用程序中并运行 lua 控制台解释器和可从控制台访问的 lua API。

现在,假设我想扩展此设置以包括另一个扩展 lua API、luasql 的 dll。新的 dll 需要 link 反对 lua 才能构建,我的理解是我不能静态地 link 反对 lua 因为现在会有两个未共享的副本lua 当我加载扩展 dll 时代码正在处理中。但是,即使我将 lua 核心库构建为 dll 并使用扩展 dll link 对其进行编辑,该 lua 核心 dll 也不会在运行时由主应用程序加载或主要的 dll。所以我的问题是:

  1. 考虑到 lua 核心 dll 不会被加载,如果我从主 dll 中的 lua 解释器加载扩展 dll 会发生什么?
  2. 如果我在运行时加载 lua 核心 dll,它会如何与静态 linked lua 库发生冲突?
  3. 这两种情况(link静态扩展 dll 和动态 linking/loading lua dll)是否会导致进程中有两个 lua 核心代码副本?
  4. 在这种情况下,如果我尝试从主 dll 的 lua environment/interpreter(即扩展 dll 中的 built/loaded)调用 API 函数,会发生什么情况?
  5. 或者 lua 是否有某种特殊机制来加载提供新 C API 函数的本机 dll,使其能够绕过正常的 linking 规则?

希望我提供了足够的细节来使问题具体化,否则我很乐意进一步完善scenario/questions。

编辑:我看过 Bundling additional Lua libraries for embedded and statically linked Lua runtime,我相信它可能有助于最终提供解决方案,但我想在 link 级别上理解它。

答案归结为:

  1. 不要尝试从链接到不同 Lua 核心的 dll 加载任何 Lua 扩展。这样做会造成彻底的混乱。
  2. 只要加载的任何 Lua 扩展都将其所有依赖项解析为正确的 Lua 内核,您使用多少 Lua 内核并不重要(除了膨胀)。

请记住,windows 总是根据符号的名称 提供的 dll 解析符号。

当你加载一个解释器(假设它是静态 linked)并加载一个模块 X,它是 linked 针对具有 Lua 解释器,加载解释器的另一个副本。这很可能导致应用程序崩溃。您需要使已加载的 dll 使用已加载的解释器,方法是 link 使用解释器对该 dll 进行处理或使用代理 dll(见下文)。

您有两个主要选择:(1) 制作由主应用程序加载的 dllA,而主应用程序又依赖于 Lua dll;然后你可以 link 所有其他 lua 模块针对 Lua dll 而没有任何问题;或 (2) 将 Lua dll 包含到 dllA 中,但保留 Lua 公开的方法,以便 lua 模块可以 linked 针对该 dllA。

我认为第一个选项更简单并且可能不需要对 Lua 模块进行任何更改(只要您可以使 Lua dll 的名称与 Lua dll 的名称相同编译模块)。

我应该提到的另一个选项是,您仍然可以使用针对 Lua DLL 编译的 Lua 模块,即使是静态编译了 Lua 解释器的应用程序。您需要使用proxy DLL; see this maillist thread解决方案和相关讨论。