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

标签 c++ c dll lua linker

我有一个相对复杂的 lua 环境,我试图了解以下内容如何工作。起始设置包括以下两个模块:

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

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

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

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

希望我已经提供了足够的详细信息来使问题具体化,如果没有,我将很乐意进一步完善场景/问题。

编辑:我看过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 模块。您需要使用 proxy DLL ;请参阅this maillist thread解决方案和相关讨论。

关于c++ - 了解静态链接嵌入式lua环境中lua扩展dll的构建/加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28305958/

相关文章:

c++ - 我需要通过我的函数传递什么样的参数。另外,如何让它根据用户需要循环多次?

c - 将结构数组传递给函数

c - 所需的sigsuspend的说明

.net - 一个 DLL,多个项目?

c++ - 卸载 DLL 后是否可以存储在 DLL 中创建的对象?

c# - 传递依赖导致同一 DLL 的版本冲突

c++ - OpenCV 和 Ruby on Rails

c++ - 如何在复制控制函数中处理 C++ 数组成员?

c++ - 为什么将套接字绑定(bind)到接口(interface)失败?

c - 字符 * 和字符 [ ] 的 scanf 之间的区别?