gpt4 book ai didi

c++ - 创建可由 Lua 加载的 C++ DLL

转载 作者:可可西里 更新时间:2023-11-01 16:39:04 24 4
gpt4 key购买 nike

我有一个使用 Lua 链接为 dll(非静态)的小应用程序。我想使用 package.loadlib (libname, funcname) 通过 Lua 加载我自己的 c++ 编写的 dll| .为此,我需要导出一个遵循 Lua 的 lua_CFunction 的函数。协议(protocol)。很明显,出于这个原因,我必须将 lua.h 合并到我的项目中,并使用 Lua 的函数来传递参数和结果。所以我的问题是:

  1. 我的 DLL 是否会使用已经加载到小型应用程序进程中的 Lua dll?
  2. package.loadlib 是立即加载和卸载我的 DLL,还是加载后我的 DLL 一直保留到 lua 脚本执行结束或应用程序终止?

最佳答案

从您的具体问题开始:

  1. 是的,但前提是您的 DLL 隐式链接到它。对此要小心,因为如果你不小心将 Lua VM 的两个拷贝链接到你的应用程序中,这可能会造成很大的困惑。就此而言,类似的问题也适用于 C 运行时。我会在 Dependency Walker 下加载整个应用程序验证它仅引用 Lua DLL 的一个实例和一个 C 运行时。

  2. 我的理解是package.loadlib()只负责加载和链接命名库中的命名函数。只要返回的函数对象(代表你命名的lua_CFunction)是活着的,那么这个DLL就肯定被加载了。如果您丢失了对该函数的最后一个引用,则该库可用于垃圾收集,如果收集到,它将被卸载。在 Lua-L 邮件列表上已经讨论过如何确保特定的 DLL 被卸载,如果你担心的话。否则,如果您只是假设 DLL 已加载,只要您可以访问其中存储的函数,就可以了。

让我补充一点,在此基础上构建的模块系统是使用 C 或 C++ 代码扩展 Lua 的更好方法。 Chapter 26 of Programming in Lua对此进行了更详细的描述,链接指向第一版在线拷贝中的那一章(描述 Lua 5.0)。请注意,模块系统在 Lua 5.1 和 Lua 5.2 中确实发生了一些变化。获得 PiL 第二版或第三版的拷贝(许多书商提供纸质和电子书形式)可能会有所帮助。

这是一个执行摘要:要在 C 中创建一个名为 foo 的模块,您需要创建 foo.dll,它至少导出一个原型(prototype)为 int luaopen_foo 的函数(lua_State *L)。该函数应该加载您的模块(通常通过在 Lua 5.1 中使用 luaL_register(),或在 Lua 5.2 中使用 luaL_newlib()luaL_setfuncs() 来注册一个充满 C 函数的表)并返回该表。在 Lua 端,您将 DLL 放在 package.cpath 中描述的路径中的某个位置,然后可以通过 local foo = require "foo" 之类的代码加载它。各种 Lua 5.x 版本之间还有其他细微差别,但是创建可以针对其中任何一个版本编译的 C 代码相对简单。

这样做的好处是模块可以从路径加载,可以用 C 或 Lua 或两者的混合编写,并且可以与其他模块很好地配合使用。您还可以通过一次调用 require 来加载所需数量的 C 函数。

关于c++ - 创建可由 Lua 加载的 C++ DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3575803/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com