【问题标题】:Understanding lua extension dll building/loading in statically linked embedded lua environment了解静态链接嵌入式 lua 环境中的 lua 扩展 dll 构建/加载
【发布时间】:2015-04-03 01:33:14
【问题描述】:

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

  • 主应用程序(无 lua 环境)
  • DLL(静态链接到 lua lib,包括解释器)

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

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

  1. 考虑到不会加载 lua 核心 dll,如果我从主 dll 中的 lua 解释器加载该扩展 dll,会发生什么情况?
  2. 如果我在运行时加载了 lua 核心 dll,这会与静态链接的 lua 库发生冲突吗?
  3. 这两种情况(在扩展 dll 中静态链接和动态链接/加载 lua dll)是否会导致 lua 核心代码的两个副本在处理中?
  4. 在这种情况下,如果我尝试从在扩展 dll 中构建/加载的主 dll 的 lua 环境/解释器调用 API 函数会发生什么?
  5. 或者 lua 是否有某种特殊机制来加载提供新的 C API 函数的本机 dll,从而可以绕过正常的链接规则?

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

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

【问题讨论】:

    标签: c++ c dll lua linker


    【解决方案1】:

    当您加载一个解释器(假设它是静态链接的)并加载一个模块 X 时,您不会遇到这种情况,该模块 X 与一个带有 Lua 解释器的 dll 链接,后者会加载该解释器的另一个副本。这很可能导致应用程序崩溃。您需要使加载的 dll 使用已加载的解释器,方法是使用解释器链接该 dll 或使用代理 dll(见下文)。

    您有两个主要选择: (1) 生成由主应用程序加载的 dllA,而后者又依赖于 Lua dll;然后,您可以将所有其他 lua 模块链接到 Lua dll,而不会出现任何问题;或 (2) 将 Lua dll 包含到 dllA 中,但保持 Lua 方法公开,以便 lua 模块可以链接到该 dllA。

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

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

    【讨论】:

      【解决方案2】:

      答案归结为:

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

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

      【讨论】:

        猜你喜欢
        • 2017-01-16
        • 2012-03-03
        • 1970-01-01
        • 2015-07-20
        • 1970-01-01
        • 2021-07-10
        • 1970-01-01
        • 2011-05-27
        • 1970-01-01
        相关资源
        最近更新 更多