我最近尝试过移植我一直在努力使用Android的引擎,并在尝试使用LUA脚本中的"需要"或" Dofile"时遇到了一些问题。<<<<<<<<<<
(快速注意:这是在C 11中写的,使用NDK-Build和Ant在Windows 7上编译(
编译LUA(版本5.3(非常简单,我使用以下文章来访问内部资产目录:50 Plaster Blog文章有关加载压缩Android资产
我在替换的fopen函数中添加了一个输出,以帮助调试此问题以及我运行时:
luaL_dofile(LuaS, "scripts/test.lua");
我得到:
>> scripts/test.lua , read
这对我来说是完美的,并在资产/脚本文件夹中运行文件,但是当我尝试在LUA脚本中运行以下行时:
local derp = require("scripts.noop")
我得到:
>> /usr/local/lib/lua/5.3/scripts/noop.so , read
浏览了LUA源代码后,此路径似乎是" luaconf.h"中定义的" lua_cdir",这也解释了为什么它寻找 *.so files而不是 *.lua ...'我不确定为什么要寻找lua_cpath而不是lua_path或如何解决此问题。
如果有人可以将我指向正确的方向,那将很棒,如果我可以通过覆盖LUA源外的搜索路径/设置来做到这一点,那就更好了。
对不起,如果这个问题写得不好,如果需要进一步的信息,我将提供。我现在有点匆忙。
感谢您的阅读。
需要检查LUA_PATH
和LUA_CPATH
,并在package.path
和package.cpath
中发现了许多不同的组合。环境变量LUA_PATH
和LUA_CPATH实际上可以合并到包装中,随着准备工作。
psuedo-c/c - 示例:
lua_getglobal(L, "package");
lua_getfield(L, -1, "path");
lua_getfield(L, -2, "cpath");
const char* cpath = lua_tostring(L, -1);
const char* path = lua_tostring(L, -2);
lua_pop(L, 3); // field 2, field 1, package table
printf("cpath: `%s`n", cpath);
printf("path: `%s`n", path);
几乎等同于减去打印调用:
>print(package.cpath)
.?.dll;C:Program FilesLuaConsolebin?.dll;C:Program FilesLuaConsolebinloadall.dll
>print(package.path)
.?.lua;C:Program FilesLuaConsolebinlua?.lua;C:Program FilesLuaConsolebinlua?init.lua;
这是需要工作的示例:
>require("abc")
(Runtime) | Stack Top: 0 | [string "require("abc")"]:1: module 'abc' not found:
no field package.preload['abc']
no file '.abc.lua'
no file 'C:Program FilesLuaConsolebinluaabc.lua'
no file 'C:Program FilesLuaConsolebinluaabcinit.lua'
no file '.abc.dll'
no file 'C:Program FilesLuaConsolebinabc.dll'
no file 'C:Program FilesLuaConsolebinloadall.dll'
--
stack traceback:
[C]: in function 'require'
[string "require("abc")"]:1: in main chunk
[C]: at 0x00401c80
问题的解决方案是让您的资产目录落入package.cpath
或package.path
中的目录中。正如@gabesechan在评论中建议的那样:"如果您将文件从资产复制到实际文件系统。它。"因此,如果您能够得到这个位置,请努力!