我有一个相对复杂的 lua 环境,我试图了解以下内容如何工作。起始设置包括以下两个模块:
- 主要应用(无lua环境)
- DLL(静态链接到lua lib,包括解释器)
该 dll 被加载到主应用程序中,并运行 lua 控制台解释器和可从控制台访问的 lua API。
现在,假设我想扩展此设置以包含另一个可扩展 lua API 的 dll,例如 luasql。新的 dll 需要链接到 lua 才能构建,我的理解是我不能静态链接到 lua,因为当我加载扩展 dll 时,进程中现在会有两个非共享的 lua 代码副本。但是,即使我将 lua core lib 构建为 dll 并使用扩展 dll 链接它,该 lua core dll 也不会在运行时由主应用程序或主 dll 加载。所以我的问题是:
- 如果我从主 dll 中的 lua 解释器加载扩展 dll,考虑到不会加载 lua 核心 dll,会发生什么?
- 如果我在运行时加载lua core dll,这会如何与静态链接的lua lib发生冲突?
- 这两种情况(在扩展 dll 中静态链接和动态链接/加载 lua dll)都会导致进程中存在 lua 核心代码的两个副本吗?
- 在这种情况下,如果我尝试从扩展 dll 中构建/加载的主 dll 的 lua 环境/解释器调用 API 函数,会发生什么情况?
- 或者 lua 是否有某种特殊的机制来加载本机 dll,提供新的 C API 函数,使其能够绕过正常的链接规则?
希望我已经提供了足够的细节来使问题具体化,如果没有,我将很乐意进一步完善场景/问题。
编辑:我看过为嵌入式和静态链接的 Lua 运行时捆绑附加 Lua 库 https://stackoverflow.com/questions/9245394/bundling-additional-lua-libraries-for-embedded-and-statically-linked-lua-runtime我相信它可能有助于最终提供解决方案,但我想在链接器级别理解它。
当您加载一个解释器(假设它是静态链接的)并加载与带有 Lua 解释器的 dll 链接的模块 X 时,不会出现这种情况,而 Lua 解释器会加载该解释器的另一个副本。这可能会导致应用程序崩溃。您需要使加载的 dll 使用已加载的解释器,方法是通过解释器链接该 dll 或使用代理 dll(见下文)。
你有两个主要选择:(1)创建由主应用程序加载的 dllA,而主应用程序又依赖于 Lua dll;然后,您可以将所有其他 lua 模块链接到 Lua dll,不会出现任何问题; (2) 将 Lua dll 包含到 dllA 中,但保持 Lua 方法公开,以便 lua 模块可以与该 dllA 链接。
我认为第一个选项要简单得多,并且可能不需要对 Lua 模块进行任何更改(只要您可以保持 Lua dll 的名称与编译模块的名称相同)。
我应该提到的另一个选项是,即使应用程序静态编译了 Lua 解释器,您仍然可以使用针对 Lua DLL 编译的 Lua 模块。你需要使用一个代理DLL http://lua-users.org/wiki/LuaProxyDllFour; see 这个邮件列表线程 http://lua-users.org/lists/lua-l/2013-11/msg00831.html的解决方案和相关讨论。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)