首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > VSTS >

在windows程序中嵌入Lua脚本发动机-使用VS IDE编译Luajit脚本引擎

2012-11-26 
在windows程序中嵌入Lua脚本引擎--使用VS IDE编译Luajit脚本引擎前些天听到一个需求:某业务方需要我们帮忙

在windows程序中嵌入Lua脚本引擎--使用VS IDE编译Luajit脚本引擎

        前些天听到一个需求:某业务方需要我们帮忙清理用户电脑上的一些废弃文件。同事完成这个逻辑的方案便是在我们程序中加入了一个很“独立”的业务逻辑:检索和删除某个程序产生的废弃文件。试想,该“独立”的逻辑之后会如何?被删掉?一直保留着?不管如何,这都意味着我们代码需要做修改,我们生成的二进制文件将产生差异,我们要为了这个需求要发一次版本。想一想客户端升级这样一个漫长且耗流量的过程,我甚至认为为了这么一个需求去浪费这些非常不值得。那么有没有一种比较好的办法,让我们不修改代码,不发布版本就能完成这样的“一次性”需求呢?当然有!是否记得若干年前,某个大公司和某个大公司吵架,当时那位新上任的CEO说某某公司可以“云暗杀”。且这种“暗杀”是一次性的,做完后可以销毁证据,且非常难以捕捉。我没有考究这个说法,但是从技术层面来说,这样的技术可以说并不复杂。那如何实现呢?就是本系列文章中讨论的:在程序中嵌入Lua脚本引擎。(转载请指明出于breaksoftware的csdn博客)

        首先简要介绍下Lua。它是巴西里约热内卢某高校发明的一种轻量级脚本语言。设计该语言的目标是:要成为一个很容易嵌入其它语言中使用的语言。由于“轻量级”和“易嵌入”这两个特性,会减少我们内嵌其的代价,这也是我选择它的最主要原因。至于稳定性,我无法评说,但是目前很多游戏中都内嵌了lua的脚本引擎,其中不乏《魔兽世界》这样的大作。我觉得像这样的产品都选用Lua,那么至少证明Lua的安全和稳定性还是非常可靠的。

       Luajit是Lua的一个即时编译器,它就是我们要内嵌windows程序的目标。http://luajit.org/是它的官方网站,我们可以从它的子页面得到源码。我正式准备该系列文章的时间是2012年11月份,此时2.0beta11已经发布。我决定以这个最新的源码作为我们的例子。

        下载

         http://luajit.org/download/LuaJIT-2.0.0-beta11.zip

        目录结构

在windows程序中嵌入Lua脚本发动机-使用VS IDE编译Luajit脚本引擎

        编译

        在http://luajit.org/install.html#windows里有详细的说明,我们只要在使用VS的Command Prompt中定位到src目录,然后执行msvcbuild.bat。

       VS IDE编译Luajit

        如此便编译成功了。但是,往往我们的工程不是用批处理文件编译的,而是用IDE。本文主要就是说明如何将该批处理文件转换为IDE编译环境。这个操作的过程将拆分各个编译和链接过程,在这个过程中,我们将发现Luajit的生成过程,这将有助于我们之后对Luajit的改造。

        总体来说,Luajit的编译和链接分为3个大部分:

    生成minilua程序。利用minilua产生一些文件。使用minilua产生的一些文件生成buildvm程序。使用buildvm产生一些文件。使用buildvm产生的一些文件生成lua程序。
        编译环境准备        在msvcbuild.bat中有这么一段设置编译环境的

        Minilua是用于根据平台来生成平台相关的代码。这些生成的代码将在之后创建的Buildvm工程中使用到。        编译Buildvm辅助程序
        在批处理中有

        将Buildvm生成为lj_*.h文件生成到LuaProject\Buildvmheader目录下。将生成的vmdef.lua放到LuaProject\jit(从原src\jit拷贝来的)的目录下。        生成obj文件

       设置如下在windows程序中嵌入Lua脚本发动机-使用VS IDE编译Luajit脚本引擎

        这样就Lua工程就只编译不链接。
        生成Dll文件
     
        当然,不否认。将批处理生成修改成IDE生成是一个简单到复杂的过程。但是这个过程将有助于我们熟悉luajit的生成过程。也将有助于我们之后对其的改造。

热点排行