Lua调用C函数:tolua++ 的使用


C与lua交互时通过栈的方式来完成,lua调用C函数时,需要同样的通过压栈出栈来完成数据交互。
使用tolua++,简化这个流程,我们可以方便的让lua调用C,原理是通过pkg文件定义C暴露给lua的接口。当然tolua++也支持C++,不过出于简单考虑,我只使用C函数接口。

tolua++官网:http://www.codenix.com/~tolua/

1.安装tolua++
我使用的版本是1.0.93,
按照INSTALL文档说明编译安装,
编译tolua++需要先安装scons,下载地址:http://www.scons.org/download.php,使用rpm包安装,rpm -ivh scons-2.1.0-1.noarch.rpm
安装完scons之后,解压tolua++
到tolua++目录下执行scons,完成安装。

2.如何使用tolua++
tolua++的src文件夹下有test目录,演示如何使用lua调用C/C++,不过貌似最简单的tarray测试,assert失败。

定义一个test.pkg文件,tolua++将会使用该文件生成lua调用C函数的实现文件,pkg文件格式跟.h文件很相似,一般情况下,只需要声明C函数,包含test.h文件,test.c为实现具体业务的文件。

例如:interface.pkg文件

    $#include "interface_c.h"
    
    int add(int x, int y);
    int sub(int x, int y);
    
    module log
    {
        void write_log(int level, char* msg);
    }


该pkg定义了add、sub和log模块的write_log接口。
    interface_c.h
    
    int add(int x, int y);
    int sub(int x, int y);
    //log 模块
    void write_log(int level, char* msg);

interface_c.cpp实现:
    int add(int x, int y)
    {
        return x + y;
    }
    int sub(int x, int y)
    {
        return x - y;
    }
    
    void write_log(int level, char* msg)
    {
        log(level, msg);
    }

有了这几个文件,我们就可以在lua中调用C的函数了,接下来还差一步,就是需要生成调用C函数的cpp文件

tolua++ -n interface -o interface.cpp interface.pkg
生成interface.cpp,长长的内容我们可以不用管了,就是每个函数的检查参数,压栈出栈等操作。

写lua测试:
[zrs@local5 ~/lua/test2]$ cat test.lua
x = add(1, 2)
print(“add result = ” .. x)

y = sub(20, 10)
print(“sub result = ” .. y)

log.write_log(1, “test log”)

[zrs@local5 ~/lua/test2]$ ll
total 28
-rwxr-xr-x 1 zrs www 218 Feb 28 18:33 interface_c.cpp
-rwxr-xr-x 1 zrs www 99 Feb 28 18:26 interface_c.h
-rwxr-xr-x 1 zrs www 3167 Feb 28 18:25 interface.cpp
-rwxr-xr-x 1 zrs www 141 Feb 28 18:24 interface.pkg
-rwxr-xr-x 1 zrs www 319 Feb 28 18:30 main.cpp
-rwxr-xr-x 1 zrs www 1161 Feb 28 18:12 Makefile
-rw-r–r– 1 zrs www 118 Feb 28 18:33 test.lua

    main.cpp
    extern "C"
    {
        #include "lua.h"
        #include "lualib.h"
        #include "lauxlib.h"
    }
    #include "interface_c.h"
    int tolua_interface_open (lua_State*);
    int main (void)
    {
        lua_State* L = lua_open();
        
        luaopen_base(L);
        tolua_interface_open(L);
        
        int ret = luaL_dofile(L,"test.lua");
        
        lua_close(L);
        return 0;
    }

  编译:

编译选项需要链接tolua++ -ltolua++5.1
测试:

[zrs@local5 ~/lua/test2]$ ./simpletest
add result = 3
sub result = 10
log level[1]:test log

测试通过。

你可能感兴趣的:(lua)