交叉编译就是为了避免同的硬件平台而在一个硬件平台上编译程序的过程。好比,在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调试信息不会被丢掉)。
至少有三种方法你能够此二进制文件:
水平有限,若有错误,给出指正。