【问题标题】:lua_open returns null using luaJITlua_open 使用 luaJIT 返回 null
【发布时间】:2014-01-18 11:34:14
【问题描述】:

使用最近的 luaJIT lua_open 返回 null。常规 lua 库不会发生这种情况。

lua_State *L = lua_open();
std::cout << L << std::endl;

输出:0x0

如何让 luaJIT 工作?

SSCCE:

#include <iostream>
#include <luajit-2.0/lua.hpp>
//linked library: libluajit-5.1.a

int main(int argc, const char * argv[])
{
    lua_State *L = luaL_newstate(); // lua_open();
    std::cout << L << std::endl; // 0x0
}

附加信息:使用makemake install 从源代码(已尝试2.0.2 和git)基于OSX 10.9 构建。使用编译器:

$ cc --version
Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin13.0.0
Thread model: posix

(使用 luajit 命令行应用程序 luajit 工作正常,测试脚本执行时不会出错。)

【问题讨论】:

  • 你使用的是哪个版本的 LuaJIT?
  • @RyanStein 当前稳定版本 2.0.2。
  • 不是 lua_open 被 lua_newstate 取代了吗?除非您使用自己的内存管理器,否则您应该能够使用 luaL_newstate,它是带有默认内存管理器的 lua_newstate。
  • 使用 luajit 你需要使用 luaL_newstate 而不是 lua_newstate 但正如 RyanStein 在他下面的评论中指出的那样 lua_open 是 luaL_newstate 的定义。
  • 你为这个问题发布了你的整个测试用例吗?

标签: c++ lua embedding luajit lua-api


【解决方案1】:

显然,x64 Mac 应用程序需要特殊处理;见http://luajit.org/install.html

如果您在 OSX 上构建直接或间接链接的 64 位应用程序 针对 LuaJIT,您需要将您的主可执行文件与这些标志链接:

-pagezero_size 10000 -image_base 100000000

【讨论】:

  • 您还知道这些参数如何影响链接步骤吗?
  • 我知道 x64 上的 LuaJIT 需要在较低的 2GB 范围内分配内存。我认为这些标志设置了让 LuaJIT 能够使用该范围的过程,但我不确定它们到底做了什么(搜索“pagezero_size”返回的 LuaJIT 相关结果比实际结果更多。)跨度>
  • 如果我无法控制我的主可执行文件(例如,因为我需要使用系统提供的主 exec 二进制文件并且我无法更改它),是否有任何解决方法或其他大大地?最好是动态方式?我能以某种方式让 LuaJIT 仍然工作吗?或者在这种情况下可能会自动切换到标准 Lua...
猜你喜欢
  • 2016-05-11
  • 2015-11-08
  • 2020-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多