2014-04-05 50 views
1

如何構建我的C++項目以將所有Lua文件包含在一個可執行文件中?我不希望人們能夠編輯Lua文件並改變遊戲。與項目一起構建Lua腳本

是否有可能,是否符合道德標準?

+1

也http://stackoverflow.com/questions/194520/creating-standalone-lua-executables見。 – lhf

+1

你也可以像[premake](https://github.com/annulen/premake/blob/master/scripts/embed.lua)那樣在文本上做到這一點,並且如果你想要搞亂,靜態混淆(即加密或壓縮)字符串隨着腳本更難 –

回答

1

那麼,你希望把所有的Lua源到你的可執行文件,所以你需要這樣的:

  • 映射文件名的方法到Lua文件:

    char lua_files[]={ 
        "filename1\0filecontents1", 
        "filename2\0filecontents2", 
        0, 
    }; 
    

    這可以通過在構建時讀取您的Lua文件目錄的腳本自動創建。
    (可選)它甚至可以預編譯這些文件,因此您可以從嵌入的Lua庫中刪除解析器。

  • 自定義裝載機:
    寫短的Lua C函數,用於搜索該陣列,並返回load和一個字符串包圍發現filecontents作爲一個Lua字符串。
    將其放入package.searchers進行註冊。

如果您稍後想允許以某種方式加載自定義腳本,請保留舊的搜索器並確保您以某種方式要求文件不在源代碼中。

+0

對不起,我不明白你的意思。 –

+0

@Ehan:詳細闡述。 – Deduplicator

+0

我想我現在有點理解了,比方說,Lua文件'test.lua'是否放在'lua'文件夾中,我會放入lua_files []'lua \ test.lua'嗎?只是想澄清。 –

2

使用「embedded bytecode」 LuaJIT的特點:

要靜態嵌入模塊的字節碼在您的應用程序,生成目標文件,只是與你的應用程序聯繫起來。

require()嘗試從導出的​​符號(在Windows上的* .exe或lua51.dll中)和package.cpath中的共享庫中加載嵌入的字節碼數據。

實施例:

luajit -b test.lua test.obj     # Generate object file 
# Link test.obj with your application and load it with require("test")