【问题标题】:What is the difference between lua 5.0.2 modules and 5.3.5?lua 5.0.2 模块和 5.3.5 有什么区别?
【发布时间】:2020-05-05 10:05:36
【问题描述】:

我尝试为 lua 编写一些 c++ 代码。首先,我使用了最新版本 5.3.5,并且能够注册一些新功能。但是我要编写代码的最终程序使用 5.0.2。在我编译旧源并使用 lua 5.0.2 构建 dll 后,require 无法读取文件

Lua 5.0.2  Copyright (C) 1994-2004 Tecgraf, PUC-Rio
> require("remaster_IO.dll")
stdin:1: error loading package `remaster_IO.dll' (remaster_IO.dll:1: `=' expected near `É')
stack traceback:
        [C]: in function `require'
        stdin:1: in main chunk
        [C]: ?

这是dll代码:

extern "C" {
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>

    __declspec(dllexport) int luaopen_remaster_IO(lua_State* L);

}

#define lua_register(L,n,f) \
        (lua_pushstring(L, n), \
        lua_pushcfunction(L, f), \
        lua_settable(L, LUA_GLOBALSINDEX))

#include <iostream>
#include <Windows.h>

int rema_add1(lua_State* L) {
    double d = luaL_checknumber(L, 1); // get item 1
    lua_pushnumber(L, d + 1);
    return 1; // number of items returned
}

int luaopen_remaster_IO(lua_State* L) {
    Beep(200, 200);
    std::cout << "Hello World!!!" << std::endl;

    lua_register(L, "average", rema_add1);

    return 1;
}

【问题讨论】:

  • 我觉得require()只理解实际lua代码的文件,共享库使用了不同的方法。
  • 我没用过Lua 5.0,所以我可能错了,但是试试loadlib([[C:\path\to\remaster_IO.dll]], "luaopen_remaster_IO")()而不是require("remaster_IO")
  • loadlib 对于解释器来说工作得很好,但我担心我需要这个的游戏有 lua 5.0.2 的简化版本。有没有机会用 require 或 dofile 做到这一点?

标签: c++ dll lua


【解决方案1】:

如果您查看at the documentation(向下滚动到require,那时它还没有每个功能的锚点……),您会发现5.0 中的require 确实只加载Lua 文件。如果您无权访问loadlib,您可能不走运。

(甚至很有可能他们编译 Lua 的方式是不支持库的动态链接根本 - 所以即使你知道你可以用来查找的错误, push & (re-)add loadlib 的指针作为 Lua 函数值,这可能还不够……)

【讨论】:

    猜你喜欢
    • 2011-04-10
    • 2013-01-11
    • 2015-11-25
    • 2016-08-15
    • 2011-06-13
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多