您的位置:首页 > 编程语言 > Lua

C/C++中调用LUA函数

2014-08-15 14:50 537 查看
1 配置工作环境

a 下载LUA安装包 sf_200472410155.zip

       b 然后,解压用于WIN32下的安装包。放在一个盘的目录下如:C:/LUA50

       c  打开VC++6.0,点击Project下的Setting中将include目录设为C:/LUA50。 并在LIB库中加入lua+lib.lib,并将C:/LUA50下的Lua+lib.dll
,Lua+lib.lib拷贝到程序当前所在目录

【( 风舞影天 的说明:来自www.luachina.net

   vc下使用lua都很类似(6.0,2003,2005),如果你能明白一般库的使用,那么想要使用lua很简单

如果是使用纯的lua库(指不使用第三方库,如luabind,lubplus等),一般你可能会得到三种形式的lua包

1,从www.lua.org下载的源码包

2,由别人提供的编译好的lua库包

3,由别人提供的编译好的lua动态链接库包

对于第一种包你只需要自己编译出lua库然后就可以象第2种方式一样使用了(实际上第三种包的使用方式只是多了一个步骤)

如何编译LUA源码呢?解压后打开lua目录的INSTALL文件,里面列出了三个工程

library: lapi.c lcode.c ldebug.c ldo.c ldump.c lfunc.c lgc.c llex.c

lmem.c lobject.c lopcodes.c lp***r.c lstate.c lstring.c

ltable.c ltm.c lundump.c lvm.c lzio.c

lauxlib.c lbaselib.c ldblib.c liolib.c lmathlib.c loslib.c

ltablib.c lstrlib.c loadlib.c linit.c

interpreter: library, lua.c

compiler: library, luac.c print.c

library,interpreter,compiler,实际上这三个你只需要第一个library,它是让你能够将LUA嵌入你的程序的库, interpreter是解释器,也就是传说中的lua.exe,可以把它看成一个使用lua库的示例程序,第三个compiler是将lua文本编译成 lua的二进制格式,所以一般来讲,第二和第三个对你来讲都不是特别重要或者根本就不会使用到的。

要编译出这三个库,你可以打开你的IDE(指VC),然后建三个工程,把每个工程对应的文件加入你建立的对应的工程,然后编译即可生成你库文件(*.lib),lua.exe和luac.exe

INSTALL中也提到了可以使用luavs.bat来生成,看看这个批处理文件的内容cd src

cl /O2 /W3 /c /DLUA_BUILD_AS_DLL l*.c

del lua.obj luac.obj

link /DLL /out:lua51.dll l*.obj

cl /O2 /W3 /c /DLUA_BUILD_AS_DLL lua.c

link /out:lua.exe lua.obj lua51.lib

cd ..

如果你能看懂它也就知道其实和上面我说的步骤大同小异了(它生成的是动态链接库而不是静态库),至于有人说找不到cl.exe,那是因为你的环境变量里没 有设置vc的二进制文件目录而导致无法找到cl.exe(只要你安装了VC,那么是肯定会有这个文件的)(作为一个程序,如果不知道环境变量这个东东,我 觉得还是有点悲哀哈)

好了,现在你有了头文件、库文件(或是动态链接库,而动态链接库除了.dll还会提供一个.lib文件),那么剩下的事情就是如何将LUA嵌入你的程序中了。

首先是在你使用到LUA函数的地方你肯定要#include ,而实际上lua有三个头文件,lua.h, lualib.h,lauxlib.h,你可以打开这些头文件查看有那些LUA API(lua5.x改变了lua4.x的一些函数名,只不过lua5.0.2使用了一些宏来兼容以前的函数名,而5.1.1则去除掉了这些宏,你可以查 看这些头文件来看那些API函数名已经改掉了,比较常见的是lauxlib.h)

ps:使用C++的同学别忘了你链接库采用的代码生成方式是C++还是C,因为C++最终会改变其函数名(如lua_open改成 lua_open@4),一般都是选择生成C的代码生成方式,因为不同的C++编译器改变的函数名规则是很可能不同的,至于为什么会改名想想函数重载,具 体的去GOOGLE吧。而如果你编译链接库时采用的是C代码生成方式,别忘了在#include时加上extern "C"

当然你仅仅包含了头文件是肯定会出现链接错误的,因为在链接的时候无法找到对应函数的代码,而这些代码都包含在静态库文件*.lib中(或是动态链接库的*.dll中),VC中加入链接库文件有两种方式,一是工程里设置,二是使用

#pragma comment(lib,"****.lib") 

)】

例一:

main.cpp

//--------------------------------------------------

#include <stdio.h>

extern "C" {

#include "lua.h"

#include "lualib.h"

#include "lauxlib.h"

}

/* LUA接口声明*/

lua_State* L;

int main ( int argc, char *argv[] )

{

/* 初始化 Lua */

L = lua_open();

/*载入LUA库 */

lua_baselibopen(L);

/* 运行LUA脚本 */

lua_dofile(L, "test.lua");

/* 清除 Lua */

lua_close(L);

return 0;

}

脚本test.lua:

用记事本写入以下代码,改扩展名为lua即可

-- simple test

print "Hello, World!"

例2:

首先用记事本写个Lua文件。

----fun.lua--------

function add ( x, y )

return x + y

end

在前面的教程,调用lua_dofile()将执行脚本。

本章里,脚本定义为一个函数。

用lua_dofile()只简单的使这个函数在我们的程序中变为有效。

LUA的函数可以接收多个参数,并可以返回多种类型的结果,这

里使用了堆栈。

       为了调用一个LUA函数,我们首先要把函数压栈。

这个函数的结果由参数决定,所以,我们要调用函数将需要

lua_call(),调用这个函数之后,返回的结果将在堆栈中存在。

整个步骤:

1.用lua_getglobal()把add函数放入堆栈

2.用lua_pushnumber()把第一个参数压入堆栈

3.用lua_pushnumber()把第二个参数压入堆栈

4.用lua_call()调用函数。

5,现在用lua_tonumber从堆栈头取出结果

6,最后用lua_pop从堆栈中移除结果值。

代码:luaadd.cpp

如果你喜欢用C代替C++,改名为luaadd.c,并且除去

extern "C"即可

#include <stdio.h>

extern "C" {

#include "lua.h"

#include "lualib.h"

#include "lauxlib.h"

}

/* the Lua interpreter */

lua_State* L;

int luaadd ( int x, int y )

{

int sum;

/* the function name */

lua_getglobal(L, "add");

/* the first argument */

lua_pushnumber(L, x);

/* the second argument */

lua_pushnumber(L, y);

/* call the function with 2

      arguments, return 1 result */

lua_call(L, 2, 1);

/* get the result */

sum = (int)lua_tonumber(L, -1);

lua_pop(L, 1);

return sum;

}

int main ( int argc, char *argv[] )

{

int sum;

/* initialize Lua */

L = lua_open();

/* load Lua base libraries */

lua_baselibopen(L);

/* load the script */

lua_dofile(L, "add.lua");

/* call the add function */

sum = luaadd( 10, 15 );

/* print the result */

printf( "The sum is %d/n", sum );

/* cleanup Lua */

lua_close(L);

return 0;

}

整个过程是这样的:

初始化lua环境 -> 加载lua脚本把lua函数add()压入栈中 -> 用lua_getglobal(L, "add");把add()取出来 -> 把参数放入栈中lua_pushnumber(L,
x); ->

lua_call(L,
1, 1);//有一个参数和一个返回值,执行lua函数 -> 从栈头取出结果lua_tonumber(L, -1); ->

用lua_pop从堆栈中移除结果值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: