在lua5.1迁移到luajit的过程中,遇到了很多坑,现在记录一下,也告诫一下后来人。

       项目地址,Windows和POSIX分开。

1. Windows下编译

1.1 使用MSVC编译

       在src目录下,运行:

msvcbuild

       之后,将src目录下的 luajit.exe 还有 lua51.dll 拷贝到其他目录下,新建 lualua/jit 两个文件夹,并把 src/jit 目录下所有lua文件拷贝到 lua/jit 文件夹下。

1.2 使用MSYS编译

       和UNIX系统相同,见下文。

1.3 使用mingw编译

       放弃吧,mingw有bug,编译不了luajit,推测是mingw自带的minge32-make.exe和msys/cgywin带的make.exe并不相同导致。

2. POSIX系统下编译

2.1 全局安装

       把luajit全局非常简单,只要在luajit源代码根目录下,运行:

make
sudo make install

即可

2.2 安装到指定路径

       如果说安装到指定路径,你一定会想当然的说:

make install PREFIX=/home/myself/luajit

       执行此命令后,确实会在指定目录生成 binlibincludeman 等文件夹,但是添加动态链接指向此目录后,却并不能链接成功,然后告诉你 /usr/local/lib 目录下没有luajit的动态库。

       查阅文档,才发现,在make时,luajit默认指定动态库安装目录为 /usr/local 。如果要修改,在make时就要指定动态库路径。

make PREFIX=/home/myself/luajit
make install PREFIX=/home/myself/luajit

2.3 在OSX下使用luajit的坑

       编写一个lua交互式解释器(源代码),在linux和windows上都正常,在MAC OS下就无法运行,通过检查,发现lua_State *L = luaL_newstate()这步返回结果为NULL,就是说在OSX上luajit初始化有问题。

       通过查资料,发现64位OSX在使用luajit存在一个内存分配相关的bug,为了避免此bug,需要在链接时加上如下参数

-pagezero_size 10000 -image_base 100000000

       同样的,如果使用ios 64bit simulator调试程序时,也需要在链接时添加这两个参数(真机调试不需要)。

       这个情况比较复杂,愿意看的可以看看,不愿意看或看不懂也无所谓。

64bit drawin系统使用luajit需要rebase的原因

       LuaJIT需要最少2GB(2^31)的虚拟地址空间用来进行操作。也就是说,对于64位指针,它的高33位需要置0 (64位cpu兼容32位指令集的一种方法,高32位和正常32位指令集相同)。

       问题是,默认情况下,64位的drawin(含osx和ios)的连接器标记的4GB地址空间是从0x00000000开始保留(即保留高32位)。正常情况下,(苹果)认为这是一种理想状态,没有使用任何RAM(它只是虚拟 地址空间,而不是真实内存)。(这样的限制也有很多好处,比如说程序员不会因为误操作直接或间接的把32位整数转换为指针了,@指针声明的时候总忘了*的我)

       -pagezero_size标记可以让编译器检查范围由4gb变小(但仍然有捕捉指针异常的功能,比如null),让程序可用的地址空间变大。

       -image_base标记告诉链接器程序代码不会使用0x0000 0001 0000 0000以下的内存地址。(0x1 0000 0000 = 2^33)