使用Luadist将Lua源代码转换为可执行文件

根据这个页面 https://github.com/LuaDist/Repository/wiki/Example:-Lua-module ,可以通过Luadist从Lua源文件创建可执行文件。但是,我不清楚如何操作。我有一个包含IUP GUI代码的Lua源文件(名为abcd.lua),可以使用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。

点赞
用户2028236
用户2028236

我一直在使用 xxd.lua 将我的 lua 脚本嵌入到 C++C 项目中。 xxd.lua 会生成一个 C 文件,其中包含给定文件的十六进制转储作为无符号字符数组。然后将 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 文件。

2017-10-25 14:53:57