交叉编译就是为了不同的硬件平台而在一个硬件平台上编译程序的过程。比如,在PC机上编译eLua二进制镜像文件,但是使用此二进制文件在eLua开发板上的过程就是交叉编译。Lua也能交叉编译。通过在PC机上交叉编译Lua生成最终的二进制文件运行在你的eLua开发板上你将获得下面两个重要的好处:
为了使用交叉编译,两个Lua目标(你的PC机和你的eLua开发板)必须能兼容(它们必须有相同的数据类型,同样的字长和同样的内存布局),这不总是正确的。举个例子,一些用于ARM目标的GCC工具链默认使用一种特别的方法来表示双精度数(被称作FPA格式),这样会造成PC机上一般的Lua编译器产生的二进制文件在一些ARM板子上没有用的。其它工具链没有此问题。其他目标(像AVR32)是大端格式存储的,与因特尔的PC机的小端存储方式相反。
为了克服上述的问题,最近一份关于“Lua 交叉编译的补丁”被发送到了Lua官方邮件列表。作为eLua工程的一部分它被进一步的修改为了兼容ARM目标。下面的陈述是怎么使用它(下面的指令在Linux下测试,没有在Windows下,但是它们做轻微的或者不做改动应该也能工作在Windows下)。
此后你会在相同目录下得到一个叫做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调试信息不会被丢掉)。
至少有三种方法你可以此二进制文件:
水平有限,如有错误,给出指正。