require "utils.lua"
stdin:1: module 'utils.lua' not found:
no field package.preload['utils.lua']
no file 'D:\blizzard\Projects\Lua'
no file '.\utils\lua.dll'
no file 'D:\blizzard\Projects\Lua\utils\lua.dll'
no file 'D:\blizzard\Projects\Lua\loadall.dll'
no file '.\utils.dll'
no file 'D:\blizzard\Projects\Lua\utils.dll'
no file 'D:\blizzard\Projects\Lua\loadall.dll'
Run Code Online (Sandbox Code Playgroud)
为什么LuaJIT搜索.dll而不是.lua以及如何解决此问题?
lua -e"print(package.path)"
./?.lua;/usr/share/lua/5.1/?.lua;/usr/share/lua/5.1/?/init.lua;/usr/lib/lua/5.1/?.lua;/usr/ LIB/LUA/5.1 /?/ init.lua
luajit -e"print(package.path)"
./?.lua;/usr/local/share/luajit-2.0.0-beta8/?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1 /?/init.lua
我试过附加lua的package.path,尽管没有骰子.LuaJIT似乎无法找到任何岩石,这很奇怪.我该怎么办?
我想知道有没有办法将结构指针传递给lua脚本,并从lua到达它的成员而不复制(用于读写目的).
那么,例如是否可以直接通过其指针覆盖ac结构的成员?
(我正在使用luajit)
假设有以下C代码:
struct Foo { int dummy; }
int tryToAllocateFoo(Foo ** dest);
Run Code Online (Sandbox Code Playgroud)
...如何在LuaJIT中进行以下操作?
Foo * pFoo = NULL;
tryToAllocateFoo(&pFoo);
Run Code Online (Sandbox Code Playgroud) 我正在为我的Lua项目编写一些测试脚本,我想确保它们在可用的不同Lua版本下正确运行.由于我的单元测试框架可能使用错误的Lua版本,如果我错误配置它,我希望是额外的安全,并在运行时检查我的测试运行的Lua版本.最好的方法是什么?
我知道分开5.1和5.2的快速方法是检查_VERSION全局,但我如何区分常规Lua 5.1和LuaJIT?
使用最近的luaJIT lua_open返回null.常规的lua库不会发生这种情况.
lua_State *L = lua_open();
std::cout << L << std::endl;
Run Code Online (Sandbox Code Playgroud)
输出: 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
}
Run Code Online (Sandbox Code Playgroud)
其他信息:从源内置在OSX 10.9(尝试都2.0.2和从GIT)与make和make install.使用编译器:
$ 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
Run Code Online (Sandbox Code Playgroud)
(使用luajit命令行应用程序luajit工作正常,测试脚本可以正常执行.)
我正在绘制一个小的 C++ 程序,它将把数组传递给 Lua 并在那里修改它们,我打算在程序中读取一个 lua 脚本,这样我就可以修改它而无需重新编译程序
我的第一个障碍是确保 Lua 能够修改已经分配的数组,而不是在 Lua 空间中再次分配它们。数据将是浮动的,并且大小会非常大,但我现在从很小的地方开始。
为了简化这个接口,我尝试了 LuaBridge 2.6,但它没有提供预期的结果。下面是一个完全“工作”的程序。
#include <iostream>
#include <cstdint>
#include <cstring>
#include <vector>
#include <lua5.3/lua.hpp>
#include <LuaBridge/LuaBridge.h>
int main(void)
{
const uint32_t LENGTH = 512 * 256;
std::vector <float> input(LENGTH),
output(LENGTH);
memset(output.data(), 0, LENGTH * sizeof(float)); // Zero the output
for(uint32_t i = 0; i < LENGTH; i++) // Populate input
input[i] = (float)i + 0.5f;
lua_State *luastate = luaL_newstate();
luabridge::push(luastate, input.data()); // Supposedly passing a pointer to the first …Run Code Online (Sandbox Code Playgroud) 在尝试并见证了我可以将Lua和LuaJIT集成到我的游戏引擎中的难以置信的轻松之后,我确信这是我想要使用的脚本语言.我想将它用于我的AI,单位描述,地图触发器等等.(尽可能真的).这个问题不仅适用于gamedev,我可以想象创建一个可编写脚本的编辑器或窗口管理器,它可以加载外部脚本(例如:使用python和包控制的sublime文本)
但现在我有一个难题:我非常感谢LuaJIT FFI提供的易用性,以便绑定到我的引擎,但我不想提供FFI的免费统治来映射作者.通过FFI进行lua-to-c调用的令人难以置信的速度(当JITted时)也是我真正想要的.
理想情况下,我会编写自己的包装器Lua文件,用FFI绑定到我的引擎,并导出一个很好的模块供地图作者和模拟器使用.我的替代方案是编写一个vanilla lua模块,这可能但更麻烦和更慢.
我在编译luajit时无法禁用FFI,因为显然我想自己使用它,但我没有看到如何在每个脚本或每个模块的基础上限制FFI.显然,FFI需要在我加载模块的lua_State中处于活动状态(之后我无法开始加载用户修改的脚本).那我该怎么办?它甚至可能吗?
编辑:在我看来,理想的工作流程是:
注意:我知道这仍然不是一个完美的(甚至是好的沙盒),正如Mike Pall已经在他的一些邮件中指出的那样,但我仍然不想让地图作者访问FFI.
我有一些cpp文件,我想用FFI将它们与LuaJit结合起来.
但问题是,我必须extern "c"为几乎每个函数添加符号,以使FFI可以访问它们.
有没有更简单的方法来完成这项工作?
该Lua的PIL和Luajit FFI教程给了两种用法__index在元表.
一个用于索引像obj [123],例如,
__index = function (self, k) return self._data+(k-self._lower)
另一种用法是定义命名方法,如教程中所给出的,
__index = { area = function(a) return a.x*a.x + a.y*a.y end? },
然后我们可以进行函数调用obj:area().
我可以同时做两件事,例如直接索引和命名方法吗?