使用Luadist

时间:2017-10-25 13:44:13

标签: lua cmake

根据此页面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。

1 个答案:

答案 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>