交叉編譯就是為了不同的硬體平台而在一個硬體平台上編譯器的過程。比如,在PC機上編譯eLua二進位鏡像檔案,但是使用此二進位檔案在eLua開發板上的過程就是交叉編譯。Lua也能交叉編譯。通過在PC機上交叉編譯Lua產生最終的二進位檔案運行在你的eLua開發板上你將獲得下面兩個重要的好處:
- 速度:在eLua開發板上的Lua編譯器不得不編譯你的Lua原始碼。而交叉編譯的話只需執行你編譯後的二進位檔案。
- 記憶體:如果你直接執行二進位檔案,因為編譯Lua為二進位檔案所以對記憶體浪費很少。但是如果你想直接在eLua開發板上執行Lua原始碼的話,你會收到“記憶體不足”錯誤,此時你可以通過編譯原始碼成二進位檔案來運行在eLua開發板上來解決此問題。當然,編譯大的Lua程式可能導致棧溢出,那樣是很難發現錯誤所在的。
為了使用交叉編譯,兩個Lua目標(你的PC機和你的eLua開發板)必須能相容(它們必須有相同的資料類型,同樣的字長和同樣的記憶體布局),這不總是正確的。舉個例子,一些用於ARM目標的GCC工具鏈預設使用一種特別的方法來表示雙精確度數(被稱作FPA格式),這樣會造成PC機上一般的Lua編譯器產生的二進位檔案在一些ARM板子上沒有用的。其它工具鏈沒有此問題。其他目標(像AVR32)是大端格式儲存的,與因特爾的PC機的小端儲存方式相反。
為了克服上述的問題,最近一份關於“Lua 交叉編譯的補丁”被發送到了Lua官方郵件清單。作為eLua工程的一部分它被進一步的修改為了相容ARM目標。下面的陳述是怎麼使用它(下面的指令在Linux下測試,沒有在Windows下,但是它們做輕微的或者不做改動應該也能工作在Windows下)。
- 首先確保你的PC機已經安裝了下面一些軟體(gcc.binutils,libc,headers...),當然還需要scons。好訊息是你應該已經安裝了他們,否則你將不能構建普通的eLua檔案。
- 進入eLua基本目錄,輸入下面的命令:scons -f cross-lua.py
此後你會在相同目錄下得到一個叫做luac的檔案。它基本和普通的Lua編譯器相同,但是它有一些參數是專門針對不同的目標平台的。顯示如下:
usage:
./luac [options] [filenames].
Available
options are:
-
process stdin
-l
list
-o
name output to file 'name' (default is "luac.out")
-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調試資訊不會被丟掉)。
至少有三種方法你可以此二進位檔案:
- 把它寫入ROM檔案系統然後在其中執行它
- 從shell中使用recv命令上傳此二進位檔案通過串口串連
- 把它寫入到SD/MMC中,並且你的開發板支援它的話,就可以從中執行它。
水平有限,如有錯誤,給出指正。