lua 5.0.2模块和5.3.5的区别是什么?

我尝试为lua编写一些c++代码。首先我使用了最新版本的5.3.5,我能注册一些新函数。但是我想为最终程序编写代码使用的是5.0.2版本。我编译了旧源代码并使用lua5.0.2构建了dll,但是require不能读取文件

Lua 5.0.2  版权所有 (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;
}
点赞
用户805875
用户805875

如果您查看文档(向下滚动到require,当时它还没有每个函数的锚点...),您将看到在5.0中,require确实仅加载Lua文件。如果您无法访问loadlib,您可能就没戏了。

(甚至有很大的机会,他们以这样的方式编译了Lua,以至于根本不支持库的动态链接 - 因此,即使您知道可以使用的错误来查找、推送和重新添加loadlib的指针作为Lua函数值,这可能还不够...)

2020-01-28 01:01:33