了解lua扩展dll在静态链接的嵌入式lua环境中构建/加载

时间:2015-02-03 18:18:29

标签: c++ c dll lua linker

我有一个相对复杂的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. 如果我从主dll中的lua intepreter加载该扩展dll,考虑到不会加载lua核心dll,会发生什么?
  2. 如果我在运行时加载lua核心dll,那与静态链接的lua lib会发生什么冲突?
  3. 这两种方案(在扩展dll中静态链接和动态链接/加载lua dll)会导致lua核心代码的两个副本正在进行中吗?
  4. 在那种情况下,如果我尝试从扩展dll中构建/加载的主dll环境/解释器调用API函数会发生什么?
  5. 或者lua是否有某种特殊的机制来加载本机dll,提供新的C API函数,允许它绕过正常的链接规则?
  6. 希望我提供了足够详细的信息来解决具体问题,如果不是,我会很乐意进一步完善情景/问题。

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

答案归结为:

  1. 请勿尝试从与不同Lua核心链接的dll加载任何Lua扩展。这样做会导致混乱。
  2. 只要加载任何Lua扩展将其所有依赖关系解析为正确的Lua核心,除了膨胀之外,使用多少Lua核心并不重要。
  3. 请注意,Windows始终会根据名称​​和解析符号来解析符号。