可以说我至少有两个lua脚本文件.
test1.lua test2.lua
两者都定义了一个init函数和其他具有相似名称的函数.
如何使用c ++/c将每个脚本文件加载到使用Lua 5.2的单独环境中,以便相同的函数名称不会发生冲突 - 我发现5.1的示例代码对我不起作用(因为setenv已经消失而lua_setuservalue没有似乎工作)
这里的示例从.lua使用句柄调用lua函数?
基本上如果我用setuservalue替换setenv - 我得到访问冲突.
我有以下项目结构
MyProject
CMakeLists.txt
\SubProject1
\SubProject1\CMakeLists.txt
\SubProject2
\SubProject2\CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)
编译二进制文件工作正常,我只是使用ADD_SUBDIRECTORY(SubProject1)
等。
每个子项目的配置基本上是SET(EXECUTABLE_OUTPUT_PATH ../Bin)
因此,我从 MyProject Dir 创建一个 Build dir
mkdir Build
cd Build
cmake ..
make install
Run Code Online (Sandbox Code Playgroud)
我的二进制文件现在位于MyProject/Build/Bin/binaryname
但安装目标失败
当我尝试使用cmake
DEB 安装程序时
INSTALL(FILES Bin/binaryname DESTINATION /opt/myproject/bin)
Run Code Online (Sandbox Code Playgroud)
它失败了,因为cmake
搜索我的项目的根目录中的路径(由于我cmake ..
最有可能使用)
所以cmake
尝试使用MyProject/Bin/binaryname
Bin/binaryname
而不是在当前工作目录中查找
我该如何解决?../Bin/binary
等不起作用 - 我不想硬编码Build/Bin/binary
-cmake
因为要构建的目录基本上可以自由选择
编辑:这是一个精简的 SubProject1CMakeList.txt
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
file(GLOB_RECURSE SOURCES "Source/*.cpp")
INCLUDE_DIRECTORIES("Include")
get_property(inc_dirs DIRECTORY PROPERTY INCLUDE_DIRECTORIES)
ADD_EXECUTABLE(mybinary ${SOURCES})
IF(UNIX)
ADD_DEFINITIONS(-fPIC)
ENDIF(UNIX)
Run Code Online (Sandbox Code Playgroud) 我通过它们的函数偏移在外部进程中挂钩函数.这对于我到目前为止挂钩的函数效果很好 - 但是我发现了一个"debugLog(char ...)"函数,它仍然存在于二进制文件中但没有进行任何打印 - 它看起来像这样
debugMessage proc near ;
xor eax, eax ; Logical Exclusive OR
retn ; Return Near from Procedure
debugMessage endp
Run Code Online (Sandbox Code Playgroud)
它被称为这样
push offset debugString ; "This is a debug message"...
call debugMessage ; Call Procedure
Run Code Online (Sandbox Code Playgroud)
现在调试消息显然已被禁用,我想挂钩到这个,因为我能够简单地挂钩到二进制文件中的类似func(char ..).
这是代码:
typedef void (__stdcall* DebugLog)(const char*);
DebugLog Real_DebugLog = (DebugLog)(0xCAFEBABE);
extern "C"
{
static void __stdcall Hook_DebugLog(const char*);
}
void __stdcall Hook_DebugLog(const char* text) {
MessageBox(NULL, text, "MyDebugLog", MB_OK);
return Real_DebugLog(text);
}
// in dll main attach..
DetourTransactionBegin(); …
Run Code Online (Sandbox Code Playgroud) 我从手册http://lua-users.org/wiki/GotoStatement中读到了这一点
我在循环中有一个类似的代码块:
while true do
if someCond == nil then
goto f -- invalid (forward jump into scope of local definition)
end
local x = 1
-- do something with x
::f::
end
Run Code Online (Sandbox Code Playgroud)
这将失败,"......跳进本地x的范围"
但为什么?如果在使用本地x之后执行跳转 - 它不再被触及 - 因此这里不再需要"本地x"
当我用x = 1(全局制作)切换局部x时,它工作正常.
这是一种缺失的疏忽或优化吗?例如,他们可能总是假设跳转到标签后可以使用局部变量
我有一个回调系统,它可以将lua函数添加到C++处理程序,例如我可以做的lua
myCObject:AddCallback(luaFunc)
Run Code Online (Sandbox Code Playgroud)
对于协程,我也有相同的
myCObject:AddCallback(coroutine.create(luaFunc))
Run Code Online (Sandbox Code Playgroud)
然后我可以使用
lua_State * pThread = lua_tothread(L, -1);
lua_resume(pThread, 0,0);
Run Code Online (Sandbox Code Playgroud)
在C++中
启动/恢复lua功能.
现在,我不想要脚本编写者写coroutine.create(luaFunc) - 我只是想自动"转换"一个lua func到一个协程.当调用AddCallback时,我在堆栈上有luaFunc - 然后我该如何继续?(使用coroutine.create我已经在堆栈上有一个线程)
编辑:我正在寻找使用C API的解决方案,例如lua_newthread
我在java中使用带有antlr的Lua.g语法生成了一个Lua Parser.
我希望解析的我的lua代码基本上是这样的
function uniqueid_some_event (e)
if (e:HasString("string1")) then
-- do something
end
if (e:HasString("string2")) then
-- do something
end
end
Run Code Online (Sandbox Code Playgroud)
我在不同的文件中有数百个这些事件用于特定的actor绑定.
现在我想解析这些文件并收集每个检查条件 - 在上面的例子中 - 我想提取"string1"和"string2"作为事件触发器.(更确切地说,我想创建一个只显示每个文件的触发器的报告)
我收集我需要以某种方式修改Lua.g以在那里添加我自己的逻辑,但我失去了因为我没有找到任何关于此的文档 - 我看了LuaEclise基本上做了一些事情,但它也不适用于我.
那么 - 是否可以向生成的LuaParser添加某种w3c DOM返回值?或者像getFunctions()这样的东西返回找到的所有函数,并在每个函数getHasStringStatements()中返回条件?