根据此页面https://github.com/LuaDist/Repository/wiki/Example:-Lua-module,可以使用Luadist从Lua源文件创建可执行文件。但是,我不清楚如何做到这一点。我有一个Lua源文件(名为abcd.lua),其IUP GUI代码与iuplua.exe运行良好。如何将其转换为可执行文件?从上面提到的页面看来,我需要创建一个文件如下:
project ( abelhas NONE )
cmake_minimum_required ( VERSION 2.8 )
include ( cmake/dist.cmake )
include ( lua )
install_lua_executable ( abcd abcd.lua )
我相信我必须将上面的文件命名为CMakeLists.txt,然后在包含此文件和abcd.lua文件的文件夹中运行cmake命令。它是否正确?我可以使用cmake-gui(cmake-qt-gui)吗? cmake是Luadist的一部分还是必须单独安装?我在Luadist文件夹中找不到任何dist.cmake文件,尽管存在一个cmake.lua文件。我会感谢对此程序的任何解释,因为我以前从未使用过cmake。
答案 0 :(得分:1)
我一直在使用xxd.lua
将我的lua脚本嵌入到C++
和C
项目中。 xxd.lua
生成一个C
文件,该文件将给定文件的hexdump保存为unsigned char数组。从那里,C
文件与程序的其余部分一起编译。
EmbLuaFiles.cmake:
file(DOWNLOAD https://github.com/gittup/tup/blob/master/src/luabuiltin/xxd.lua
"${CMAKE_SOURCE_DIR}/Path/To/Store/File/At"
SHOW_PROGRESS
EXPECTED_HASH hash_value)
macro(EmbedLuaFiles lua depends)
add_custom_command(OUTPUT LuaScriptBinding.c
COMMAND "${CMAKE_COMMAND}" -E copy
"${CMAKE_SOURCE_DIR}/DevelopmentTools/xxd.lua" "${CMAKE_BINARY_DIR}"
COMMAND ${lua} xxd.lua LuaScript.lua LuaScriptBinding.c
DEPENDS ${depends}
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}")
endmacro()
在CMakeLists.txt中:
include(EmbedLuaFiles)
add_custom_command(OUTPUT lua.exe
COMMAND "${CMAKE_COMMAND}" --build "${CMAKE_BINARY_DIR}/lua-build"
COMMAND "${CMAKE_COMMAND}" -E copy "${CMAKE_BINARY_DIR}/lua-build/lua.exe"
"${CMAKE_BINARY_DIR}"
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/lua-src"
)
set(LUA_C_FILES LuaScriptBinding.c)
EmbedLuaFiles(lua.exe "${CMAKE_BINARY_DIR}/lua.exe")
set(LUA_EXE lua.exe ${LUA_C_FILES})
add_executable(TargetProject ${SOURCE_FILES} ${LUA_EXE})
在c / c++
中,可以使用以下方式访问这些内容:
#if DEBUG
#define LUA_SCRIPT "LuaScript.lua"
#define LUA_SCRIPT_LEN 0
#else
extern "C"
{
extern unsigned char LuaScript_lua[];
extern unsigned int LUA_SCRIPT_LEN;
};
#define LUA_SCRIPT (char*)LuaScript_lua
#define LUA_SCRIPT_LEN LUA_SCRIPT_LEN
#endif
void loadFile(lua_state *luaState, const char *luaFile, size_t len)
{
#if !DEBUG
if(luaL_loadbuffer(luaState, luaFile, len, luaFile))
#else
if(luaL_loadfile(luaState, luaFile) != 0)
#endif
cerr << "Failed to load lua file" << endl;
}
int main()
{
luaState = LuaL_newstate();
luaL_openlibs(luaState);
loadFile(luaState, LUA_SCRIPT, LUA_SCRIPT_LEN);
lua_call(luaState, 0, 0);
// run the script
lua_close(luaState);
}
如果您正在运行病毒防护,则需要确保将您正在运行的目录xxd.lua
标识为免除,否则将不会生成c
个文件。< / p>