gpt4 book ai didi

c++ - luaL_dofile在已知有效的字节码上失败,可用于未编译版本

转载 作者:行者123 更新时间:2023-12-02 09:53:00 25 4
gpt4 key购买 nike

我已经组装了一个非常简单的Lua引擎,但是它似乎拒绝了在lua控制台中工作的字节码。未编译的版本可在引擎中使用。我是否以某种方式使用luac错误?
我使用给定的命令进行编译并以'./a.out'运行。
res / default.lua:

print("Setting up world structure.")
luac命令:
luac -o res/default.lux res/default.lua
MWE:
#define SCRIPTDIR "res/"

#define THROW_IF_NONZERO(x,m) if((x)!=0) throw std::runtime_error(m);
#define THROW_IF_ZERO(x,m) if((x)==0) throw std::runtime_error(m);

extern "C" {
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}

#include "sys/stat.h"

#include <string>
#include <system_error>
#include <iostream>

using std::string;

class Entity {
private:
lua_State *m_lua;
public:
Entity() : Entity(nullptr) { }
Entity(lua_State *lua) : m_lua{lua} { }
virtual ~Entity() { }
void load_and_run(string);
};

class WorldEntity : public Entity {
public:
WorldEntity(lua_State *lua) : Entity(lua) {
luaL_openlibs(lua);
}
~WorldEntity() { }
};

int main() {
lua_State *lua{nullptr};
try {
lua = luaL_newstate();
WorldEntity eWorld{lua};
eWorld.load_and_run("default"); // load default.lua/lux
} catch(std::exception &e) {
if (lua != nullptr) {
lua_close(lua);
}
std::cout << "Error: " << e.what() << std::endl;
}
return 0;
}

void Entity::load_and_run(string filename) {
THROW_IF_ZERO(m_lua, "Lua not started.");
filename = SCRIPTDIR + filename + ".lux";
struct stat sb;
int rc = stat(filename.c_str(), &sb);
if (rc == -1) {
filename.pop_back();
filename += "a";
rc = stat(filename.c_str(), &sb);
THROW_IF_NONZERO(rc, "File not found!");
}
std::cout << "File: " << filename << std::endl;
// Currently won't run compiled Lua scripts, not sure why.
rc = luaL_dofile(m_lua, filename.c_str());
THROW_IF_NONZERO(rc, "Could not load lua file.");
}
编译命令:
gcc src/bug001mwe.cpp -std=c++14 -llua -lstdc++
脚本的正确输出:
File: res/default.lua
Setting up world structure.
字节码输出错误:
File: res/default.lux
Error: Could not load lua file.
两个文件,从lua控制台输出:
Setting up world structure.

最佳答案

让我感到困惑的是,它在lua控制台中有效,但在我的程序中却无效。我在调用luaL_dofile之后添加了对lua_tostring的调用,如下所示:

rc = luaL_dofile(m_lua, filename.c_str());
std::ostringstream ostr;
ostr << "Could not load lua file. ";
ostr << lua_tostring(m_lua, -1);
THROW_IF_NONZERO(rc, ostr.str());
错误字符串变为:
Error: Could not load lua file. res/default.lux: version mismatch in precompiled chunk
有没有搞错?
长话短说,由于某些无关内容中软件包的依赖关系过旧,因此我安装了Lua的先前版本。较早的luac拦截了luac命令并编译为有效但不兼容的字节码。卸载了我不需要的无关软件包,现在一切正常。
故事的寓意:始终在Lua堆栈上检查错误字符串,它将(可能)告诉您哪里出了问题。

关于c++ - luaL_dofile在已知有效的字节码上失败,可用于未编译版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62792963/

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