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

2024-04-19

我有一个相对复杂的 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 加载。所以我的问题是:

  1. 如果我从主 dll 中的 lua 解释器加载扩展 dll,考虑到不会加载 lua 核心 dll,会发生什么?
  2. 如果我在运行时加载lua core dll,这会如何与静态链接的lua lib发生冲突?
  3. 这两种情况(在扩展 dll 中静态链接和动态链接/加载 lua dll)都会导致进程中存在 lua 核心代码的两个副本吗?
  4. 在这种情况下,如果我尝试从扩展 dll 中构建/加载的主 dll 的 lua 环境/解释器调用 API 函数,会发生什么情况?
  5. 或者 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(使用前将#替换为@)

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

  • 中间件 API 的最佳实践是什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我们正在开发一个中间件 SDK 采用 C 和 Java 语言 供游戏开发人员 动画软件开发人员 阿凡达开
  • asp.net c# 将数据集中的数据转换为电子邮件正文?

    从数据集到电子邮件正文的最佳方式是什么 我有一个 net 控制台应用程序 用于根据存储过程的结果发送电子邮件通知 并且想知道如何最好地从 SQL 数据转到电子邮件正文 带有颜色和字体的 html 正文是最好的 但纯文本也可以 thanks
  • 隐式方法组转换陷阱

    我想知道为什么给定代码的输出 在 LinqPad 中执行 void Main Compare1 Action Main Dump Compare2 Main Dump bool Compare1 Delegate x return x Ac
  • C++ 中的单例和抽象基类

    最近我遇到了关于实现 Singleton 但涉及抽象基类的问题 假设我们有这样的类层次结构 class IFoo it s ABC class Foo public IFoo 我们的单例类定义如下 template
  • 如何“杀死”Pthread?

    我正在学习 Pthreads 并且想知道杀死这样一个对象的最佳方法是什么 在寻找类似的问题后 我无法找到 明确 的答案 但请随时向我指出任何相关问题 我正在使用一个小型客户端服务器应用程序 其中服务器主线程正在侦听套接字上的客户端连接 每次
  • C++ 非类型参数包扩展

    我正在编写由单一类型参数化的模板函数 并且具有可变数量的相同类型 而不是不同类型 的参数 它应该检查第一个值是否在其余值中 我想这样写 include
  • 使用 Selenium for C# 登录 Facebook

    我一直在使用 Selenium C 框架并尝试进行 facebook 登录 但没有任何运气 这是我到目前为止得到的 基于这篇文章 使用 Selenium 测试 Facebook Connect 应用程序 https stackoverflo
  • 返回指向 std::vector 中的对象的 a

    我有一个关于返回对向量元素的引用的非常基本的问题 有一个向量vec存储类的实例Foo 我想访问这个向量中的一个元素 不想使用向量索引 我应该如何编码该方法getFoo here include
  • 使用成员作为实现者来实现接口

    我有实现 IA 的 A 类 现在我需要创建也应该实现 IA 的类 B B 类有 A 类的实例作为成员 有什么方法可以定义A的实例实现B类中的IA吗 interfase IA void method1 void method2 void me
  • 套接字:监听积压并接受

    listen sock backlog 在我看来 参数backlog限制连接数量 这是我的测试代码 server initialize the sockaddr of server server sin family AF INET ser
  • 在 ncurses 中使用退格键

    我设置了一个简单的 ncurses 程序 它使用 getch 一次读取一个字符并将它们复制到缓冲区中 我遇到的问题是检测到按下退格键 这是相关代码 while buffer i c getch EOF i if c n break else
  • std::string 在 Visual Studio 上的具体行为?

    我有一个项目需要读取 写入大文件 我决定使用 ifstream read 将这些文件一次性放入内存中 放入 std string 中 这似乎是在 C 中执行此操作的最快方法 http insanecoding blogspot com 20
  • 无法将方法组“Read”转换为非委托类型“bool”

    我正在尝试使用SqlDataReader检查条目是否存在 如果存在则返回ID 否则返回false 当我尝试编译时 出现错误 无法将方法组 Read 转换为非委托类型 bool 我一直在遵循在 VB 中找到的示例 但似乎翻译可能不正确 pri
  • 如何使用 libpq 获取双精度值?

    The examples http www postgresql org docs 9 3 interactive libpq example htmllibpq 文档中展示了如何通过将整数值转换为主机字节序表示来获取整数值 我很好奇必须做
  • 如何解释“错误C2018:未知字符'0x40'?[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 在编译一些代码时 我收到以下信息 错误 C2018 未知字符 0x40 我想知道如何解决这样的问题 这是我要开始的地方
  • 在 try catch 块中返回到 catch 内是否不好?这是很好的做法

    在 try catch 块中从 C 中的 catch 块返回值是不好的做法吗 try Some code return 1 catch return 0 哪种使用 try catch 的方法是好的做法 不需要 只要返回的值是你想要的 你可以
  • 如何分析 VSCode 中函数的性能

    我用 C Golang 编写了一个程序 如何找到占用最高 CPU 周期的函数 目的是提高正在执行的程序的性能 2021 年 10 月 金香儿哈娜 https github com hyangah宣布 tweet https twitter
  • C/C++ 通过 Android NDK 在 JNI 中看不到 Java 方法

    我正在尝试从使用 NDK 构建的 C 类文件调用 Java 方法 它不断抛出常见的 未找到非静态方法 错误并导致整个 Android 应用程序崩溃 下面的代码片段 有些东西可能不需要 但我按原样保留它们 因为焦点 问题在于refreshJN
  • 在类中使用 std::chrono::high_resolution_clock 播种 std::mt19937 的正确方法是什么?

    首先 大家好 这是我在这里提出的第一个问题 所以我希望我没有搞砸 在写这篇文章之前我用谷歌搜索了很多 我对编码 C 很陌生 我正在自学 考虑到有人告诉我 只为任何随机引擎播种一次是一个很好的做法 我在这里可能是错的 什么是正确 最佳 更有效
  • 具有多种类型的 C# 泛型类型推断

    我有以下通用方法 用于将一种类型的输入对象序列化为超类型 如下所示 public string SerialiseAs

随机推荐

  • SQL INSERT/SELECT 不在插入表中的地方

    INSERT INTO tableA SELECT Col1 Col2 NOW FROM tableB WHERE tableA Col1 is not already in tableB Col1 我无法正确使用 WHERE 子句来确保从
  • PHP foreach 循环外访问变量

    我是 PHP 新手 谁能告诉我如何访问 foreach 之外的 foreach 循环变量 请通过代码查找如下 我需要它在下面的 html img 标签的 src 属性中
  • 如何对来自 Alamofire 的 JSON 进行排序并返回最终的 JSON 对象 (swiftyJSON)

    我无法简洁地从 api 提取数据 将用户当前位置添加到对象中 然后根据计算出的距离对数据进行排序 stackoverflow 的问题并不能完全回答我面临的问题 看这里 如何在 Swift 中对从 JSON 服务器文件读取的帖子进行排序 ht
  • golang 交换两个数字

    我正在尝试了解 Go 的内部结构 考虑下面的代码 a b 10 5 b a a b 上面的代码完美地交换了 2 个数字 a 变成了 5 b 变成了 10 我无法理解这是如何工作的 考虑到第二行代码 如果a先分配给b 那么b将是10 现在 如
  • 使用 Spring MVC 和 ajax 返回字符串时编码错误

    我有一个网页 使用 Ajax 请求希伯来语字符串 但该字符串返回为 奇怪的是 当使用 JSTL 而不是 Ajax 将相同的字符串插入页面时 它会正确显示 在我的网页中我声明 那是我的控制器 RequestMapping get label
  • 在 Ruby 中获取 URL 的重定向

    根据 Facebook 图形 API 我们可以使用以下命令请求用户个人资料图片 示例 https graph facebook com 1489686594 picture 但上一个链接的真实图片URL是 http profile ak f
  • 阅读 R Shiny DT 数据表中长文本的更多按钮

    我想在我的 R Shiny DT 数据表中包含 阅读更多 和 阅读更少 按钮 用于具有溢出 长文本的单元格 这个精彩的答案 https stackoverflow com a 51242920 4892627作者 Devansh J 在纯
  • Spring Security 4.2 中的 StrictHttpFirewall 与 Spring MVC @MatrixVariable

    升级到 spring security 4 2 4 后 我发现 StrictHttpFirewall 现在是默认的 不幸的是 它不能与 spring MVC MatrixVariable 很好地配合 因为 不再允许 如何解决这个问题 Exa
  • kSystemSoundID_Vibrate 不适用于 AVAudioPlayer Play

    我正在开发一个半双工 VOIP 呼叫应用程序 因为我试图在楼层交换期间播放音调和振动 进行楼层交换是将讲话者从 A 更改为 B 或者反之亦然 以进行半双工呼叫 如果我尝试使用 AudioServicesPlayAlertSound 播放提示
  • Django,从模型方法进行查询过滤

    我有这些模型 def Foo Models model size models IntegerField other fields def is active self if check condition return True else
  • 渲染空中继器

    When Repeater不包含任何项目 它根本不会以 HTML 形式呈现 甚至HeaderTemplate or FooterTemplate 即使它是空的 我也需要在客户端操作它 有没有办法始终在 HTML 中呈现 Repeater I
  • 使用 SendKeys.Send() 模拟右 Shift+Ctrl

    I m trying to Send right Shift Ctrl to my RichTextBox But as default it sends the left keys SendKeys Send Is there anywa
  • 如何启动超过 16 个 Android 模拟器

    运行 16 个模拟器时 adb devices shows List of devices attached emulator 5584 emulator 5582 emulator 5580 emulator 5578 emulator
  • UPDATE的目标表不可更新

    我需要运行这个查询 UPDATE TempRH T JOIN SELECT offices id MAX Poids AS Poids FROM TempRH GROUP BY offices id T1 ON T1 offices id
  • 如何将 pandas Series 作为行而不是列写入 CSV?

    我需要写一个pandas Series对象将 CSV 文件视为行 而不是列 简单地做 the series to csv file csv 给了我一个这样的文件 record id 2013 02 07 column a 7 0 colum
  • 重置表单重置按钮上的 ckeditor 值

    我的表单上有一个表单重置按钮 a href class btn Reset a 这将重置表单上除 ckeditor 之外的所有控件 并且我希望能够重置表单上 ckeditor 的值 ckeditor 的关联文本区域被重置 那么我该如何将 c
  • 如何包含同一项目中另一个文件的模块?

    依照指示本指南 https doc rust lang org 0 12 0 guide html crates and modules我创建了一个 Cargo 项目 src main rs fn main hello print hell
  • 渲染 Markdown 文件时,标题不显示在 R Markdown 上

    我正在尝试将 Rmd 文件转换为 md 输出 md document 但标题未显示在渲染的文件上 当我尝试将同一文件渲染为 html 文件 输出 html document 时 标题确实会显示 标题显示在渲染的文档上 title Test
  • VBA中返回数组的函数

    我是一名会计师 我需要每天将每笔客户付款与未清发票进行匹配 我在这个网站上发现了 Michael Schwimmer 发布的非常漂亮和优雅的 VBA 代码 https berndplumhoff gitbook io sulprobil e
  • 了解静态链接嵌入式lua环境中lua扩展dll的构建/加载

    我有一个相对复杂的 lua 环境 我试图了解以下内容如何工作 起始设置包括以下两个模块 主要应用 无lua环境 DLL 静态链接到lua lib 包括解释器 该 dll 被加载到主应用程序中 并运行 lua 控制台解释器和可从控制台访问的