关于cmake:使用Luadist可执行的Lua源代码

Lua source to executable using Luadist

根据此页面https://github.com/LuaDist/Repository/wiki/Example:-Lua-module,可以使用Luadist从Lua源文件创建可执行文件。但是,我不清楚如何执行此操作。我有一个带有IUP GUI代码的Lua源文件(名为abcd.lua),可以与iuplua.exe一起很好地运行。如何将其转换为可执行文件?从上面提到的页面看来,我需要创建一个文件,如下所示:

1
2
3
4
5
6
7
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的一部分,还是必须单独安装?尽管存在一个cmake.lua文件,但在Luadist文件夹中找不到任何dist.cmake文件。由于我以前从未使用过cmake,因此请您对此程序进行任何解释,我将不胜感激。


我一直使用xxd.lua将lua脚本嵌入到C++C项目中。 xxd.lua生成一个C文件,该文件将给定文件的十六进制转储保存为无符号char数组。从这里开始,C文件与程序的其余部分一起编译。

EmbLuaFiles.cmake:

1
2
3
4
5
6
7
8
9
10
11
12
13
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中:

1
2
3
4
5
6
7
8
9
10
11
12
13
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++中可以通过以下方式访问:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 #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文件。