luajit2.1 iOS编译64bit以及通用库

18 篇文章 0 订阅

苹果要求老的app需要在6月份后支持64位,新的app从2.1开始就必须支持64bit。由于我们用了luajit,而luajit2.0.x版本只支持32bit。在2.1版本开始支持64bit了,但目前只是alpha版本。

下面的luajit库编译后支持arm64,armv7和模拟器。即一个库支持64bit编译的所有cpu,不需要针对新老iphone做特殊处理。


下载LuaJit

通过GIT下载Luajit代码
git clone http://repo.or.cz/luajit-2.0.git
进入Luajit下载代码目录签出分支v2.1
git checkout v2.1

编译脚本
在luajit-2.0的上一层目录运行
LUAJIT=./luajit-2.1
DEVDIR=`xcode-select -print-path`/Platforms
IOSVER=iPhoneOS8.1.sdk
SIMVER=iPhoneSimulator.sdk
IOSDIR=$DEVDIR/iPhoneOS.platform/Developer
SIMDIR=$DEVDIR/iPhoneSimulator.platform/Developer
IOSBIN=$DEVDIR/../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=$SIMBIN 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 ../lib/ios


注意在编译模拟器的库时:
ISDKF="-arch x86_64 -isysroot $SIMDIR/SDKs/$SIMVER -miphoneos-version-min=7.0"
上面红色字体部分,该段主要用于编译模拟器的luajit库。由于xcode5.0后的更改,必须用这种方式指定编译为模拟器库,否则默认编译为macos.本人在这里折腾了很久。

集成

将luajit/build目录下的libluajit21.a链接到工程。

由于iphone5s以上虚拟机需要x86_64支持,luajit为了支持此模式需要在other linker flags中增加参数(注意,只需要对模拟器添加参数,针对ios不能添加,否则apple不会通过审核)

-pagezero_size 10000 -image_base 100000000

可能陷阱

1: 目前luajit 2.1只是alpha版本,有没有大的bug不清楚

2:在arm64平台下的luajit的bytecode与早前的bytecode有区别无法直接在mac下编译后在arm64平台使用。它使用了最新的lj_gc64与lj_fr2。所以直接在macos下编译的lua代码不能在ios上运行。需要上传源代码在ios下编译



要离线安装LuaJIT 2.1,你可以按照以下步骤进行: 1. 在可以访问网络的机器上,使用wget命令下载LuaJIT 2.1的源代码压缩包。你可以从LuaJIT的GitHub页面上找到最新的源代码压缩包(https://github.com/LuaJIT/LuaJIT/releases)。假设下载链接为`https://github.com/LuaJIT/LuaJIT/archive/v2.1.0.tar.gz`,执行以下命令下载源代码: ``` wget https://github.com/LuaJIT/LuaJIT/archive/v2.1.0.tar.gz ``` 2. 将下载的压缩包复制到离线机器: 将下载的压缩包(例如`v2.1.0.tar.gz`)复制到你想进行离线安装的机器上。 3. 解压源代码压缩包: 在离线机器上,进入包含LuaJIT源代码压缩包的目录,并执行以下命令解压缩: ``` tar -xf v2.1.0.tar.gz ``` 4. 进入解压后的目录: 执行以下命令进入解压后的LuaJIT目录: ``` cd LuaJIT-2.1.0 ``` 5. 修改Makefile: 使用文本编辑器打开Makefile文件,可以使用以下命令打开该文件: ``` vi Makefile ``` 在Makefile文件中,找到以下行: ``` PREFIX ?= /usr/local ``` 修改为: ``` PREFIX ?= /你的安装路径 ``` 请将 `/你的安装路径` 替换为你希望安装LuaJIT的目录路径。 6. 编译和安装LuaJIT: 在LuaJIT目录中,执行以下命令来编译和安装LuaJIT: ``` make sudo make install ``` 这将编译并安装LuaJIT。请注意,如果你遇到权限问题,可以使用适当的命令(例如`sudo make install`)来获取管理员权限。 7. 确认安装: 安装完成后,可以在终端中执行以下命令来确认LuaJIT安装是否成功: ``` luajit -v ``` 如果输出显示LuaJIT的版本信息,则表示安装成功。 现在,你已经完成了离线安装LuaJIT 2.1的过程。请注意,上述步骤提供了一种常见的离线安装方法,具体步骤可能因操作系统版本和个人需求而有所不同。如果遇到问题,建议参考LuaJIT的官方文档或相关资源获取更详细的安装指导。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值