交叉編譯就是爲了避免同的硬件平臺而在一個硬件平臺上編譯程序的過程。好比,在PC機上編譯eLua二進制鏡像文件,可是使用此二進制文件在eLua開發板上的過程就是交叉編譯。Lua也能交叉編譯。經過在PC機上交叉編譯Lua生成最終的二進制文件運行在你的eLua開發板上你將得到下面兩個重要的好處:shell
爲了使用交叉編譯,兩個Lua目標(你的PC機和你的eLua開發板)必須能兼容(它們必須有相同的數據類型,一樣的字長和一樣的內存佈局),這不老是正確的。舉個例子,一些用於ARM目標的GCC工具鏈默認使用一種特別的方法來表示雙精度數(被稱做FPA格式),這樣會形成PC機上通常的Lua編譯器產生的二進制文件在一些ARM板子上沒有用的。其它工具鏈沒有此問題。其餘目標(像AVR32)是大端格式存儲的,與因特爾的PC機的小端存儲方式相反。工具
爲了克服上述的問題,最近一份關於「Lua 交叉編譯的補丁」被髮送到了Lua官方郵件列表。做爲eLua工程的一部分它被進一步的修改成了兼容ARM目標。下面的陳述是怎麼使用它(下面的指令在Linux下測試,沒有在Windows下,可是它們作輕微的或者不作改動應該也能工做在Windows下)。佈局
此後你會在相同目錄下獲得一個叫作luac的文件。它基本和普通的Lua編譯器相同,可是它有一些參數是專門針對不一樣的目標平臺的。顯示以下:測試
usage:lua
./luac [options] [filenames]. spa
Available options are: debug
- process stdin 調試
-l list code
-o name output to file 'name' (default is "luac.out") orm
-p parse only
-s strip debug information
-v show version information
-cci bits cross-compile with given integer size
-ccn type bits cross-compile with given lua_Number type and size
-cce endian cross-compile with given endianness ('big' or 'little')
-- stop handling options
如今剩下的工做就是當使用編譯器根據上面列出的數據選擇正確的參數。下面的是分別針對不一樣ARM編譯工具鏈而具體的參數
eLua image type Architecture Compiler Command
Floating point (lua) ARM7TDMI Cortex-M3 ARM966E-S arm-gcc
./luac -ccn float_arm 64 -cce little -o <script.luac> -s <script.lua>
Floating point (lua) ARM7TDMI Cortex-M3 ARM966E-S codesourcery
./luac -ccn float 64 -cce little -o <script.luac> -s <script.lua>
Integer (lualong) ARM7TDMI Cortex-M3ARM966E-S arm-gcc codesourcery
./luac -ccn int 32 -cce little -o <script.luac> -s <script.lua>
Floating point (lua) AVR32 avr32-gcc
./luac -ccn float 64 -cce big -o <script.luac> -s <script.lua>
Integer (lualong) AVR32 avr32-gcc ./luac -ccn int 32 -cce big -o <script.luac> -s <script.lua>
(注意的是某些時候你要爲X86平臺交叉編譯eLua的話,就使用通常的lua編譯器。)編輯時你能夠省略掉-s參數,可是這會致使產生更大的二進制文件(由於你不使用-s的話Debug調試信息不會被丟掉)。
至少有三種方法你能夠此二進制文件:
水平有限,若有錯誤,給出指正。