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从堆栈中移除结果值。
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从堆栈中移除结果值。
相关文章推荐
- c++调用lua函数
- C++保存和调用lua函数
- Lua与C/C++的交互5:C/C++调用Lua函数
- 【木头Cocos2d-x 031】Lua篇(第06章):Lua调用C++的函数
- 在Lua中调用c++函数示例
- Lua调用c++函数
- (如何在C++代码中调用Lua脚本的函数?)
- 069 - 问,lua程序设计(第四部分)笔记三,c++调用lua函数 - everettjf - C++博客
- 【木头Cocos2d-x 030】Lua篇(第05章):C++调用Lua的函数
- C++调用lua函数的一种通用办法
- 如何在c/c++中调用LUA函数
- tolua++绑定C/C++语言函数供lua调用
- lua调用C++函数崩溃时,查看lua的调用栈信息 (特别适用于tolua++)
- 使用C++调用 LUA 函数收藏
- lua脚本调用C++动态库中的函数
- C/C++中调用LUA函数
- 简答的lua调用c++函数例子
- C++调用Lua的函数
- VC6.0配置LUA编译环境及LUA调用C++函数的简单示例
- 解决c++ 调用lua 方式! 避免重复写逻辑对应的lua 函数