標籤:
最近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, 我將編譯項目放到百度雲端硬碟(上傳中。。。。),方便下載,
項目編譯可以在ios模擬器或者真機上編譯,如果真機沒有越獄,可以通過ftp將編譯後
的lua指令碼發到ftp伺服器上,同樣更方便的可以通過在ios模擬器上編譯, 然後在可寫路徑找到編譯後的指令碼,編譯後將指令碼拷到
自己的項目中就能完美運行。
注意的是,如果函數main.lua不能通過
executeScriptFile方法執行,必須通過require來執行main.lua
轉載請註明出處,from 部落格園 HemJohn
luajit 64位 for cocos2dx 編譯ios解決方案