了解静态链接嵌入式 lua 环境中的 lua 扩展 dll building/loading
Understanding lua extension dll building/loading in statically linked embedded lua environment
我有一个相对复杂的 lua 环境,我正在尝试了解以下 would/could 是如何工作的。启动设置包括以下两个模块:
- 主应用程序(无 lua 环境)
- DLL(静态 linked 到 lua 库,包括解释器)
dll 加载到主应用程序中并运行 lua 控制台解释器和可从控制台访问的 lua API。
现在,假设我想扩展此设置以包括另一个扩展 lua API、luasql 的 dll。新的 dll 需要 link 反对 lua 才能构建,我的理解是我不能静态地 link 反对 lua 因为现在会有两个未共享的副本lua 当我加载扩展 dll 时代码正在处理中。但是,即使我将 lua 核心库构建为 dll 并使用扩展 dll link 对其进行编辑,该 lua 核心 dll 也不会在运行时由主应用程序加载或主要的 dll。所以我的问题是:
- 考虑到 lua 核心 dll 不会被加载,如果我从主 dll 中的 lua 解释器加载扩展 dll 会发生什么?
- 如果我在运行时加载 lua 核心 dll,它会如何与静态 linked lua 库发生冲突?
- 这两种情况(link静态扩展 dll 和动态 linking/loading lua dll)是否会导致进程中有两个 lua 核心代码副本?
- 在这种情况下,如果我尝试从主 dll 的 lua environment/interpreter(即扩展 dll 中的 built/loaded)调用 API 函数,会发生什么情况?
- 或者 lua 是否有某种特殊机制来加载提供新 C API 函数的本机 dll,使其能够绕过正常的 linking 规则?
希望我提供了足够的细节来使问题具体化,否则我很乐意进一步完善scenario/questions。
编辑:我看过 Bundling additional Lua libraries for embedded and statically linked Lua runtime,我相信它可能有助于最终提供解决方案,但我想在 link 级别上理解它。
答案归结为:
- 不要尝试从链接到不同 Lua 核心的 dll 加载任何 Lua 扩展。这样做会造成彻底的混乱。
- 只要加载的任何 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解决方案和相关讨论。
我有一个相对复杂的 lua 环境,我正在尝试了解以下 would/could 是如何工作的。启动设置包括以下两个模块:
- 主应用程序(无 lua 环境)
- DLL(静态 linked 到 lua 库,包括解释器)
dll 加载到主应用程序中并运行 lua 控制台解释器和可从控制台访问的 lua API。
现在,假设我想扩展此设置以包括另一个扩展 lua API、luasql 的 dll。新的 dll 需要 link 反对 lua 才能构建,我的理解是我不能静态地 link 反对 lua 因为现在会有两个未共享的副本lua 当我加载扩展 dll 时代码正在处理中。但是,即使我将 lua 核心库构建为 dll 并使用扩展 dll link 对其进行编辑,该 lua 核心 dll 也不会在运行时由主应用程序加载或主要的 dll。所以我的问题是:
- 考虑到 lua 核心 dll 不会被加载,如果我从主 dll 中的 lua 解释器加载扩展 dll 会发生什么?
- 如果我在运行时加载 lua 核心 dll,它会如何与静态 linked lua 库发生冲突?
- 这两种情况(link静态扩展 dll 和动态 linking/loading lua dll)是否会导致进程中有两个 lua 核心代码副本?
- 在这种情况下,如果我尝试从主 dll 的 lua environment/interpreter(即扩展 dll 中的 built/loaded)调用 API 函数,会发生什么情况?
- 或者 lua 是否有某种特殊机制来加载提供新 C API 函数的本机 dll,使其能够绕过正常的 linking 规则?
希望我提供了足够的细节来使问题具体化,否则我很乐意进一步完善scenario/questions。
编辑:我看过 Bundling additional Lua libraries for embedded and statically linked Lua runtime,我相信它可能有助于最终提供解决方案,但我想在 link 级别上理解它。
答案归结为:
- 不要尝试从链接到不同 Lua 核心的 dll 加载任何 Lua 扩展。这样做会造成彻底的混乱。
- 只要加载的任何 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解决方案和相关讨论。