最近luajit發布了64位beta版,由於appstore上線必須是64位的應用,而且我的游戲項目用到lua腳本,所以必須要用到64位的luajit來編譯lua腳本。
方法如下:
在luajit官網下載luajit源碼:
http://luajit.org
解壓后,需要通過在luajit的文件夾上層目錄,打開終端編譯,編譯方法如下命令:
LUAJIT=./luajit-2.1.0-beta2
DEVDIR=`xcode-select -print-path`/Platforms
IOSVER=iPhoneOS9.3.sdk
SIMVER=iPhoneSimulator.sdk
IOSDIR=$DEVDIR/iPhoneOS.platform/Developer
SIMDIR=$DEVDIR/iPhoneSimulator.platform/Developer
IOSBIN=$DEVDIR/../Toolchains/XcodeDefault.xctoolchain/usr/bin/
SIMBIN=$SIMDIR/usr/bin/
BUILD_DIR=$LUAJIT/build
rm -rf $BUILD_DIR
mkdir -p $BUILD_DIR
rm *.a 1>/dev/null 2>/dev/null
echo =================================================
echo ARMV7 Architecture
ISDKF="-arch armv7 -isysroot $IOSDIR/SDKs/$IOSVER"
make -j -C $LUAJIT HOST_CC="gcc -m32 " CROSS=$IOSBIN TARGET_FLAGS="$ISDKF" TARGET=armv7 TARGET_SYS=iOS clean
make -j -C $LUAJIT HOST_CC="gcc -m32 " CROSS=$IOSBIN TARGET_FLAGS="$ISDKF" TARGET=armv7 TARGET_SYS=iOS
mv $LUAJIT/src/libluajit.a $BUILD_DIR/libluajitA7.a
echo =================================================
echo ARM64 Architecture
ISDKF="-arch arm64 -isysroot $IOSDIR/SDKs/$IOSVER"
make -j -C $LUAJIT HOST_CC="gcc " CROSS=$IOSBIN TARGET_FLAGS="$ISDKF" TARGET=arm64 TARGET_SYS=iOS clean
make -j -C $LUAJIT HOST_CC="gcc " CROSS=$IOSBIN TARGET_FLAGS="$ISDKF" TARGET=arm64 TARGET_SYS=iOS
mv $LUAJIT/src/libluajit.a $BUILD_DIR/libluajit64bit.a
echo =================================================
echo IOS Simulator Architecture
ISDKF="-arch x86_64 -isysroot $SIMDIR/SDKs/$SIMVER -miphoneos-version-min=7.0"
make -j -C $LUAJIT HOST_CFLAGS="-arch x86_64" HOST_LDFLAGS="-arch x86_64" TARGET_SYS=iOS TARGET=x86_64 clean
make -j -C $LUAJIT HOST_CFLAGS="-arch x86_64" HOST_LDFLAGS="-arch x86_64" TARGET_SYS=iOS TARGET=x86_64 amalg CROSS=$IOSBIN TARGET_FLAGS="$ISDKF"
mv $LUAJIT/src/libluajit.a $BUILD_DIR/libluajitx86_64.a
libtool -o $BUILD_DIR/libluajit21.a $BUILD_DIR/*.a 2> /dev/null
mkdir -p $BUILD_DIR/Headers
cp $LUAJIT/src/lua.h $BUILD_DIR/Headers
cp $LUAJIT/src/lauxlib.h $BUILD_DIR/Headers
cp $LUAJIT/src/lualib.h $BUILD_DIR/Headers
cp $LUAJIT/src/luajit.h $BUILD_DIR/Headers
cp $LUAJIT/src/lua.hpp $BUILD_DIR/Headers
cp $LUAJIT/src/luaconf.h $BUILD_DIR/Headers
mv $BUILD_DIR/libluajit21.a ./
注意的是,以上的IOSVER變量必須設置為當前系統的ios sdk的版本號。
編譯好后,在luajit文件夾下會新增了build文件夾,里面有三個庫和Headers文件夾,Headers里面
存放的是項目必須包含的頭文件,另外還有三個庫.a庫:
libluajit64bit.a:是arm 64位的庫,用在ios 64位設備上,
libluajitA7.a:是arm 32位的庫,用在ios 32位設備上,
libluajitx86_64:是x86指令的庫,用在pc和iOS模擬器上。
將對應平台的庫和所有頭文件導入項目中用於解析luajit的字節碼。
由於iphone5s以上虛擬機需要x86_64支持,luajit為了支持此模式需要在other linker flags中增加參數(注意,只需要對模擬器添加參數,針對ios不能添加,否則apple不會通過審核):
-pagezero_size 10000 -image_base 100000000
因為arm64使用了最新的lj_gc64與lj_fr2的c庫,必須通過gc64庫編譯lua腳本,所以,我們需要在真機上編譯,或者在
luajit的源碼中,找到lj_arch.h文件,在文件開始地方加入宏:
#define LUAJIT_ENABLE_GC64 ,讓編譯的時候使用gc64位庫編譯。
以下的代碼是我在廖大寫的編譯方法,其實就是將lua腳本放在source文件夾下,
通過lua的string.dump將腳本轉成對應平台的字節碼,然后導出編譯后的
字節碼,具體實現看編譯項目的main.lua, 我將編譯項目放到百度雲盤(http://pan.baidu.com/s/1dFCwoO5),方便下載,
項目編譯可以在ios模擬器或者真機上編譯,如果真機沒有越獄,可以通過ftp將編譯后
的lua腳本發到ftp服務器上,同樣更方便的可以通過在ios模擬器上編譯, 然后在可寫路徑找到編譯后的腳本,編譯后將腳本拷到
自己的項目中就能完美運行。
注意的是,如果函數main.lua不能通過
executeScriptFile方法執行,必須通過require來執行main.lua
轉載請注明出處,from 博客園 HemJohn