创建一个可以被 Lua 加载的 C++ DLL(动态链接库)
我有一个小应用程序,它使用链接为 dll 的 Lua(非静态)。我想使用 package.loadlib (libname,funcname) 通过 Lua 加载我自己编写的 C ++-编写的 dll。为此,我需要导出遵循 Lua 的 lua_CFunction 协议的函数。显然,为此,我必须将 lua.h
合并到我的项目中,并使用 Lua 的函数传递参数和结果。所以我的问题是:
- 我的 DLL 是否使用已加载到小型应用程序进程中的 Lua dll?
package.loadlib
是否立即加载和卸载我的 DLL,还是我的 DLL 一旦加载就一直存在,直到 lua 脚本执行结束或应用程序终止?
原文链接 https://stackoverflow.com/questions/3575803
以下是根据你的具体问题撰写的回答:
是的,但前提是你的 DLL 必须是隐式链接的。要小心处理这一点,因为如果你意外地将两个 Lua VM 链接到应用程序中,这可能会导致极大的混乱。同样的问题也适用于 C 运行时。我建议你使用 Dependency Walker 加载整个应用程序,以验证它只引用了一个 Lua DLL 和一个单独的 C 运行时。
我的理解是,
package.loadlib()
只负责加载并链接到指定库中的指定函数。只要返回的函数对象(表示你所命名的lua_CFunction
)存在,那么这个 DLL 一定被加载了。如果你失去了对该函数的最后一个引用,则该库可能被垃圾回收,并且如果被回收,它将被卸载。在 Lua-L 邮件列表中曾经有过关于如何确保特定的 DLL 被卸载的讨论。否则,如果你只是假设只要你能访问它所存储的函数就说明 DLL 被加载了,你就没问题了。
不过我想补充说明,使用建立在此之上的模块系统是一种更好的方式,用来扩展 Lua 的 C 或 C++ 代码。《Lua 编程》第 26 章对此进行了更详细的描述,并且该链接引导你浏览第一版(描写 Lua 5.0)的在线副本。请注意,模块系统在 Lua 5.1、Lua 5.2 中都发生了一些变化。获得《Lua 编程》第二版或第三版(这两个版本都可通过许多书店以纸质和电子书的形式获取)可能会对你有所帮助。
这里是一份简要总结:你可以在 C 中创建一个名为 foo
的模块,创建 foo.dll
并导出至少一个具有原型 int luaopen_foo(lua_State *L)
的函数。该函数应加载你的模块(通常使用 luaL_register()
在 Lua 5.1 中,或使用 luaL_newlib()
或 luaL_setfuncs()
在 Lua 5.2 中来注册一个充满 C 函数的表)并返回该表。在 Lua 代码中,你需要将 DLL 放在 package.cpath
中描述的路径上,然后可以通过 local foo = require "foo"
这样的代码来加载它。各个 Lua 5.x 版本之间还存在其他微小的差异,但相对而言,创造适用于任何 Lua 5.x 版本的 C 代码是相对简单的。
使用这种方法,你的优势是可以通过路径加载模块,可以写入 C 或 Lua 或二者混合的组合,可以很好地与其他模块共存。使用单个 require
调用就可以加载您需要的多个 C 函数或仅加载你需要的少数 C 函数。
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
你可以动态地链接到与应用程序相同的 Lua dll。
至于package.loadlib,我不知道它是如何工作的。阅读源代码?