Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos Mac OS X上的Lua编译脚本-英特尔vs PPC_Macos_Lua_Cross Compiling_Luac - Fatal编程技术网

Macos Mac OS X上的Lua编译脚本-英特尔vs PPC

Macos Mac OS X上的Lua编译脚本-英特尔vs PPC,macos,lua,cross-compiling,luac,Macos,Lua,Cross Compiling,Luac,在MacOSX通用二进制应用程序中使用Lua5.0已有几年了。Lua脚本使用luac编译,编译后的脚本与应用程序捆绑在一起。他们在Tiger and Leopard、Intel或PPC中正常工作 为了避免当时出现库问题,我只是简单地将Lua src树添加到我的Xcode项目中,并按原样编译,没有任何问题 是时候更新到更现代的Lua版本了,所以我用5.1.4的源代码树替换了我的源代码树。我使用makemacosx重新构建了luac(机器在英特尔上运行Leopard) 未编译的脚本一如既往地在Tig

在MacOSX通用二进制应用程序中使用Lua5.0已有几年了。Lua脚本使用luac编译,编译后的脚本与应用程序捆绑在一起。他们在Tiger and Leopard、Intel或PPC中正常工作

为了避免当时出现库问题,我只是简单地将Lua src树添加到我的Xcode项目中,并按原样编译,没有任何问题

是时候更新到更现代的Lua版本了,所以我用5.1.4的源代码树替换了我的源代码树。我使用makemacosx重新构建了luac(机器在英特尔上运行Leopard)

未编译的脚本一如既往地在Tiger and Leopard、Intel和PPC中正常工作

但是,现在编译的脚本无法加载到PPC机器上

所以我用“ansi”标志重新构建了luac,并重新编译了我的脚本。同样的错误。类似地,“generic”的构建标志也没有带来任何乐趣


谁能告诉我下一步该做什么

Lua的编译脚本基本上是在一个简短的头文件之后转储出来的原始字节码。头文件记录了用于编译字节码的平台的一些属性,但加载程序只验证当前平台是否具有相同的属性

不幸的是,当加载在另一个平台上编译的字节码时,即使是由同一版本的Lua编译的字节码,也会产生问题。当然,由不同版本的Lua编译的脚本不可能正常工作,因为Lua的版本号包含在字节码头中,所以内核会捕获加载它们的尝试

简单的答案就是不要编译脚本。如果Lua自己编译脚本,您只需担心应用程序的各种构建中Lua核心之间可能存在的版本不匹配,这并不难处理

实际上,支持编译字节码的完全交叉兼容性是非常重要的。在那封电子邮件中,Mike Pall发现了以下问题:

  • Endianess:根据需要交换输出

  • sizeof(size\u t)
    ,影响巨大的字符串常量:在 降级

  • sizeof(int)
    ,影响
    MAXARG\u Bx
    MAXARG\u sBx
    :在 降级

  • typeof(lua\u Number)
    :在C语言中很容易,但仅当主机和目标 遵循相同的FP标准;精确 升级时丢失(罕见情况); 发生错误时警告非整数 降级到
    int32

  • 从我在邮件列表中看到这个问题的所有讨论中,我看到了两种可能可行的方法,假设您不愿意考虑只发送未编译的Lua脚本。

    第一种方法是在加载编译脚本时修复字节顺序。事实证明,这比您预期的要容易,因为它可以通过替换读取脚本文件的低级函数来完成,而无需重新编译内核本身。事实上,它甚至可以在纯Lua中完成,方法是向提供您自己的函数。只要平台上唯一的兼容性问题是字节顺序,这就应该有效

    第二种方法是修补核心本身,以便在所有平台上对已编译脚本使用通用表示。这一点已尽可能通过以下方式描述:

    。。。。 我相信最好的方法是 不支持字节顺序或交叉编译 第三方转储/卸载对。这个 文件ldump.c和lundump.c是 完全可替换;他们出口一种新产品 单一、定义明确的入口点。这个 预编译块的格式不正确 神圣的;您可以使用任何格式, 只要ldump.c和lundump.c同意 关于它。(例如,Rici湖 考虑为其编写文本格式 预编译块。)

    就个人而言,我建议认真考虑不要预编译脚本,从而完全避免平台可移植性问题

    编辑:多亏了lhf的评论,我更新了对字节码头的描述。我还没有读过Lua源代码的这一部分,我可能应该先检查一下,然后再对标题中存在或不存在的信息进行判断

    下面是来自的片段,它形成了与正在运行的平台匹配的头的副本,以便与正在加载的字节码进行比较。它只是与
    memcmp()
    进行比较,以获得与文件头的精确匹配,因此任何不匹配都会导致stock loader()拒绝该文件

    /*
    * make header
    */
    void luaU_header (char* h)
    {
     int x=1;
     memcpy(h,LUA_SIGNATURE,sizeof(LUA_SIGNATURE)-1);
     h+=sizeof(LUA_SIGNATURE)-1;
     *h++=(char)LUAC_VERSION;
     *h++=(char)LUAC_FORMAT;
     *h++=(char)*(char*)&x;                         /* endianness */
     *h++=(char)sizeof(int);
     *h++=(char)sizeof(size_t);
     *h++=(char)sizeof(Instruction);
     *h++=(char)sizeof(lua_Number);
     *h++=(char)(((lua_Number)0.5)==0);             /* is lua_Number integral? */
    }
    
    可以看出,标题长度为12个字节,包含签名(4个字节,“
    Lua
    ”)、版本和格式代码、用于结尾的标志字节、类型的大小
    int
    size\u t
    指令
    Lua\u编号
    ,以及指示
    Lua\u编号
    是否为整型的标志

    这允许捕捉大多数平台差异,但并不试图捕捉平台差异的所有方式


    我仍然支持上面提出的建议:第一,提供可编译的源代码;第二,定制
    ldump.c
    lundump.c
    以存储和加载通用格式,另外注意,任何自定义格式都应重新定义标头的LUAC_格式字节,以免与库存字节码格式混淆。

    Lua字节码不可移植。您应该随应用程序一起提供源脚本

    如果需要考虑下载大小,则它们通常比字节码形式短

    如果知识产权是一个问题,您可以使用代码混淆器,并记住,分解Lua字节码绝非易事


    如果需要考虑加载时间,您可以在安装脚本中本地预编译源代码。

    您可能需要使用支持不同endianness的修补字节码加载程序。
    请参阅。

    我猜想您是在英特尔上编译脚本的