初试Lua

听说Lua脚本语言可以很好地嵌入到C与C++程序中,今天我小试了一下。

首先是下载。从Lua官网上下载源码到本地。http://www.lua.org/download.html

最好去下载最近的源码。首先的说明一下,我本地系统是CentOS,不过没关系。

得到了源码,然后解压安装:

$ tar zxf lua-5.2.2.tar.gz
$ cd lua-5.2.2
$ make linux test

通常是没有问题的,但是我遇到了一个找不到readline.h文件之类的编译错误。错误原因是没有readline包,安装readline-devel.i686开发包就OK了。

$ yum search readline     #先查一下需地什么包

$ sudo yum install rearch readline-devel.i686

安装好了,再编译,通过了。然后安装:

$ sudo make install

完成!

参考:

[1] Linux编译Lua

[2] Linux下编译安装Lua脚本环境

接下来就是写一个测试程序与测试脚本,参考别人的。

如下是C程序源码,test.c 

#include <stdio.h>

#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>

int main()
{
    int x;
    long int r;
    lua_State *pLua;

    pLua = luaL_newstate();
    if (pLua == NULL)
        return 0;
    luaL_openlibs(pLua);

    if (luaL_loadfile(pLua, "test.lua") != 0) {
        printf("Load file fail.\n");
        return 0;
    }
    lua_pcall(pLua, 0, LUA_MULTRET, 0);
    lua_getglobal(pLua, "func1");

    printf("Enter a number : ");
    scanf("%d", &x);

    lua_pushnumber(pLua, x);
    if (lua_pcall(pLua, 1, 1, 0) != 0) {
        printf("\nError : %s", lua_tostring(pLua, -1));
        return 0;
    }
    r = lua_tonumber(pLua, -1);
    lua_pop(pLua, 1);

    printf ("%d != %ld\n", x, r);
    lua_close(pLua);

    return 0;
}

编译命令: 

$ gcc -lm -o test test.c /usr/local/lib/liblua.a -llua -ldl

注意编译命令,要加/usr/local/lib/liblua.a库文件,而且这个库要放在源文件的后面,放前面就会编译不通过。

接下来是Lua脚本test.lua


function func1 (x)
    print ("I am here!");
    return x * 2
end

然后执行./test看一下效果。然后,随意更改func1()的函数体。这样,不会重新编译,也可以随心地更改程序的逻辑了。

参考:

[1] 上述代码提供者(由于我不小心关闭了源始的网页,现在找不着,请原谅,感谢你)

[2] Lua和C/C++互相调用实例分析

时间: 2024-11-18 00:03:08

初试Lua的相关文章

lua 牛刀初试

文件 MsgPro.lua local Player = require "LuaScript/Player" local createPlayer = Player.createPlayer local p = createPlayer("asas",2) print(p:getlevel()) print(p:getname()) local msg_head = {} local function main_loop() while true do peek_

Lua 笔记--语法

        Lua允许"多重赋值",也就是一下子将多个值赋予多个变量.每个值或每个变量之间以逗号分隔: a, b = 10, 2*x         在多重赋值中,Lua先对等号右边的所有元素求值,然后才执行赋值. x, y = y, x        -->交换x 与y         Lua总是会将等号右边值的个数调整到与左边变量的个数相一致.规则是:若值的个数少于变量的个数,那么多余的变量会被赋为nil :若值的个数更多的话,那么多余的值会被"静悄悄地&quo

Lua判断Table是否为空的方法

这篇文章主要介绍了Lua判断Table是否为空的方法(空的table即{}),如何判断lua中的table是否是空的table呢,本文就试验了多个方法,最后得出比较好的判断方法,需要的朋友可以参考下 判断方法结论: 代码如下: a={} if next(a) ~=nil then dosomething end 最近在项目里面大量使用的lua,其中lua的table是lua中重要的数据结构,可以被用来当做C++中的数组,vector,map来使用. 如何判断lua中的table是否是空的tabl

Openresty服务器使用lua脚本写的Hello World简单实例

  这篇文章主要介绍了Openresty服务器使用lua脚本写的Hello World简单实例,OpenResty (也称为 ngx_openresty)是一个全功能的 Web 应用服务器.它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项,需要的朋友可以参考下 Openresty提供了丰富的接口和变量给Lua,开发者可以充分利用Lua语言特性和这些接口进行高效率开发.万事开头难,但是对于编程来说能写出Hello world就已经算是成功一半了. 1.安装openr

Lua文件读写详解

  这篇文章主要介绍了Lua文件读写详解,本文讲解了文件读写的简单模型和完整模型,并给出了一个操作示例,需要的朋友可以参考下 lua里的文件读写模型来自C语言,分为完整模型(和C一样).简单模型. 1.简单模型 io.input([file]) 设置默认的输入文件,file为文件名(此时会以文本读入)或文件句柄(可以理解为把柄,有了把柄就可以找到文件),返回文件句柄. io.output([file]) 设置默认的输出文件,参数意义同上. io.close([file]) 关闭文件,不带参数关闭

Lua获取文件长度和判断文件是否存在函数

  这篇文章主要介绍了Lua获取文件长度和判断文件是否存在函数分享,需要的朋友可以参考下 获得文件长度 代码如下: function length_of_file(filename) local fh = assert(io.open(filename, "rb")) local len = assert(fh:seek("end")) fh:close() return len end 判断文件是否存在 代码如下: function file_exists(pat

Lua goto 用法举例

Lua支持goto语法, 但是有一定的局限性. 例如 1. 不能在block外面跳入block(因为block中的lable不可见),  2. 不能跳出或者跳入一个函数.  3. 不能跳入本地变量的作用域. Lua poses some restrictions to where you can jump with a goto. First, labels follow the usual visibility rules, so you cannot jump into a block (b

Lua脚本自动生成APK包

  这篇文章主要介绍了Lua脚本自动生成APK包,本文脚本适用于cocos2dx+lua的项目,需要的朋友可以参考下 上次用了纯bat写了个脚本生成APK包,感觉bat扩展性和语法差的令人发指,这次用lua重写了一个脚本 可以根据需要自行扩展了. 使用前tool path 还有 target path的前两个还是需要自己设置下. 一些小的函数 jit_file copy_file 我就不贴了 比较简单,用来luajit 和 拷贝. ? 1 2 3 4 5 6 7 8 9 10 11 12 13

Lua脚本获取喜马拉雅MP3音频地址

  下面介绍了Lua脚本获取喜马拉雅MP3音频地址,本文直接给出代码实例,需要的朋友可以参考下 在Linux下可以直接运行 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 #!/usr/bin/lua5.1 --需要luacurl http://luacurl.luaforge.net/ --luajson htt