cocos2d-x3.1.1 集成luajit for arm64

原文地址:http://blog.csdn.net/odiecn/article/details/42499233

系统环境

优山美地 OS X Yosemite
Xcode 6.1.1
cocos2d-x 3.1.1

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

编辑脚本编译Luajit v2.1

#!/usr/bin/env bash

DIR="( cd "( dirname “${BASH_SOURCE}” )" && pwd )"
LIPO=“xcrun -sdk iphoneos lipo”
STRIP=“xcrun -sdk iphoneos strip”

IXCODE=xcode-select -print-path
ISDK=$IXCODE/Platforms/iPhoneOS.platform/Developer
ISDKVER=iPhoneOS8.1.sdk
ISDKP=$IXCODE/usr/bin/

if ! -e $ISDKP/ar ]; then
sudo cp $ISDK/usr/bin/ar $ISDKP
fi

if ! -e $ISDKP/ranlib ]; then
sudo cp $ISDK/usr/bin/ranlib $ISDKP
fi

if ! -e $ISDKP/strip ]; then
sudo cp $ISDK/usr/bin/strip $ISDKP
fi

make clean
ISDKF="-arch arm64 -isysroot $ISDK/SDKs/$ISDKVER"
make HOST_CC=“gcc " CROSS=”$ISDKP" TARGET_FLAGS="$ISDKF" TARGET=arm64 TARGET_SYS=iOS

也可以将git下的luajit复制到cocos2d-x对应的luajit路径下
之后将附件里的shell脚本替换目录下存在的build_ios.sh脚本,运行该脚本可以生成一个新的Luajit.a包以及一套完整的支持arm64的lib for cocos2dx3.1.1。
只要大家自行替换项目目录下
cocos2d-x/external/ 对应的ios目录下的.a文件就可以

同时XCODE6新升级后需要有几点补丁修改
修改1:
在AppDelegate.cpp加入代码

extern “C”
{

#if defined (__unix) || (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
#ifndef ENABLE_COMPATIBILITY_WITH_UNIX_2003
#define ENABLE_COMPATIBILITY_WITH_UNIX_2003
#include <stdio.h>
#include <dirent.h>
FILE *fopen$UNIX2003( const char *filename, const char *mode )
{
return fopen(filename, mode);
}
size_t fwrite$UNIX2003( const void *a, size_t b, size_t c, FILE *d )
{
return fwrite(a, b, c, d);
}
char *strerror$UNIX2003( int errnum )
{

return strerror(errnum);

}

DIR *opendir$INODE64(const char * a)
{
return opendir(a);
}

struct dirent *readdir$INODE64(DIR *dir)
{
return readdir(dir);
}

#endif
#endif</dirent.h></stdio.h>
}

修改2:
iphone5s以上虚拟机需要x86_64支持

luajit为了支持此模式需要在other linker flags中增加参数 -pagezero_size 10000 -image_base 100000000

以上就可以保证在新版的xcode6.1.1中完美的运行arm64与虚拟机x86_64的luajit代码了。
最后感谢xl同学给予的帮助!

生成好的.a文件与luajit打包sh脚本请通过百度网盘下载
http://pan.baidu.com/s/1ntxD1dn

欢迎各位同学加群:296733909

:2:厉害:2:

luajit 支持64位了?廖大快!

:2: 超赞!!!!

廖大这个可以研究研究。

这个要顶

我们的游戏,在一些低端机型上,3.2很流畅,3.3就没法玩

因为性能问题,我基本放弃了3.3

貌似又有了希望

怎么不顶上首页

差别会有这么大吗?
你们游戏是计算量比较大的游戏吗?

我是cocos2dx3.3 final,xcode 是6.1.1

我是将git下的luajit复制到cocos2d-x对应的luajit路径下
之后将附件里的shell脚本替换目录下存在的build_ios.sh脚本,运行该脚本的

结果报这个错,麻烦侠看下
./lj_recdef.h:224:1: error: use of undeclared identifier ‘recff_rawlen’
recff_rawlen,

./lj_libdef.h:17:3: error: use of undeclared identifier ‘lj_cf_rawlen’; did you
mean ‘lj_cf_rawset’?
lj_cf_rawlen,
^~~~~~~~~~~~
lj_cf_rawset

现在app store已经强制要求64位了,64下的编译不解决,cocos lua 没实用价值了

cocos lua支持64位。

是compiled,原始的当然支持

这个要顶,支持64BIT了终于。。

quick 团队没啥反应啊。

请问“luajit为了支持此模式需要在other linker flags中增加参数 -pagezero_size 10000 -image_base 100000000”这个具体怎么设置呢?

:13:32位怎么办?

— Begin quote from ____

引用第14楼keltonxian于2015-02-12 15:13发表的 :
请问“luajit为了支持此模式需要在other linker flags中增加参数 -pagezero_size 10000 -image_base 100000000”这个具体怎么设置呢? http://www.cocoachina.com/bbs/job.php?action=topost&tid=281157&pid=1243310

— End quote

如图设置,我这么设置的iphone6模拟器可正常运行了

在AooDelegate.cpp中添加代码后出现linker错误:
duplicate symbol _fopen$UNIX2003 in:
/Users/zhongqi/Documents/zbdg/Build/Intermediates/MyLuaGame.build/Debug-iphonesimulator/MyLuaGame iOS.build/Objects-normal/x86_64/AppDelegate.o
/Users/zhongqi/Documents/zbdg/Build/Products/Debug-iphonesimulator/libcocos2dx iOS.a(CCImage-480BC5818CB61150.o)
duplicate symbol _fwrite$UNIX2003 in:
/Users/zhongqi/Documents/zbdg/Build/Intermediates/MyLuaGame.build/Debug-iphonesimulator/MyLuaGame iOS.build/Objects-normal/x86_64/AppDelegate.o
/Users/zhongqi/Documents/zbdg/Build/Products/Debug-iphonesimulator/libcocos2dx iOS.a(CCImage-480BC5818CB61150.o)
duplicate symbol _strerror$UNIX2003 in:
/Users/zhongqi/Documents/zbdg/Build/Intermediates/MyLuaGame.build/Debug-iphonesimulator/MyLuaGame iOS.build/Objects-normal/x86_64/AppDelegate.o
/Users/zhongqi/Documents/zbdg/Build/Products/Debug-iphonesimulator/libcocos2dx iOS.a(CCImage-480BC5818CB61150.o)
ld: 3 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
请问是什么原因啊:4:

哥你试过运行没。。不行啊,虽然是编出了arm64的lib,但根本没带jit功能啊,print(jit)为空。。当然了只跑纯粹的lua代码是无所谓,但之前大量用到了coroutine.yield需要穿c栈,只有真正的jit版才支持啊。。。

好吧,我搞错了。。这引擎默认链接的居然是liblua.a。。了个去!