lua 5.3和C++互相调用测试

举报
Amrf 发表于 2018/11/28 22:33:27 2018/11/28
【摘要】 http://www.zyh1690.org/lua-with-c-call-each-other/ 本文介绍如何在C++程序中使用Lua脚本,以及它们如何相互调用。在此,我们需要使用上篇文章《Lua-5.3.1 源码编译》中生成的动态链接库,以及相关的头文件,它们分别是:x:\x\lua-5.3.1\Debug 目录下的 lua5.3.1.lib 以及 lua5.3.1.dll 以及 x:...

http://www.zyh1690.org/lua-with-c-call-each-other/

本文介绍如何在C++程序中使用Lua脚本,以及它们如何相互调用。在此,我们需要使用上篇文章《Lua-5.3.1 源码编译》中生成的动态链接库,以及相关的头文件,它们分别是:

x:\x\lua-5.3.1\Debug 目录下的 lua5.3.1.lib 以及 lua5.3.1.dll 以及 x:\x\lua-5.3.1\src 目录下的 lua.h,lualib.h,lauxlib.h,luaconf.h 四个文件。

首先新建一个控制台工程 clua,在解决方案的根目录新建一个lua文件夹

然后在lua文件夹下创建两个子文件夹:include 和 lib,并将上面四个头文件复制到 include 文件夹,lua5.3.1.lib 复制到 lib 文件夹。

接着在项目属性页中进行以下配置:

添加包含目录:

添加附加库目录:

添加附加依赖项:

Lua调用C++:

项目中新建 cluac.cpp 文件,其代码如下:

#include <iostream>
using namespace std;
#include <stdio.h>
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
 
lua_State* L;   //lua 的解释器
 
//注意average的定义形式
int average(lua_State *L)  
{  
//返回栈中元素的个数  
int n = lua_gettop(L);  
double sum = 0;  
int i;  
for (i = 1; i <= n; i++)  
{  
if (!lua_isnumber(L, i))   
{  
lua_pushstring(L, "Incorrect argument to 'average'");  
lua_error(L);  
}  
sum += lua_tonumber(L, i);  
}  
/* push 平均值 */  
lua_pushnumber(L, sum / n);  
/* push 总和 */  
lua_pushnumber(L, sum);  
 
/* return the number of results */  
return 2;  
}
 
 
int main()
{
L = luaL_newstate();
 
/* 载入Lua基本库 */
luaL_openlibs(L);
 
/* 注册函数 */
lua_register(L, "aver", average); 
 
/* 运行脚本 */
luaL_dofile(L, "test.lua");
 
lua_getglobal(L,"avg");  
cout<<"avg is:"<<lua_tointeger(L,-1)<<endl;  
lua_pop(L,1);  
lua_getglobal(L,"sum");  
cout<<"sum is:"<<lua_tointeger(L,-1)<<endl;  
/* 清除Lua */
lua_close(L);
return 0;
}


然后在项目目录下(也即 cluac\cluac\ 目录下),添加test.lua文件,其代码如下:

1

avg, sum = aver(10, 20, 30, 40, 50)

然后 F7 编译,编译成功,但还不能运行,我们还需将 lua5.3.1.dll 放到Debug文件夹中(包含exe的),此时 Ctrl+F5 运行可以看到结果:

C++调用Lua:

1.无参数传递(C++->Lua)

同上方法,建立项目,新建脚本文件 loop.lua 如下:

1

2

3

4

5

print "Start"
for i=1,10 do
   print(i) 
end
print "End"


CPP代码:

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

#include <stdio.h>
 
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
 
/* the Lua interpreter */
lua_State* L;
 
int main ( int argc, char *argv[] )
{
/* initialize Lua */
L = lua_open();
 
/* load Lua base libraries */
lua_baselibopen(L);
 
/* run the script */
lua_dofile(L, "do-me.lua");
 
/* cleanup Lua */
lua_close(L);
 
return 0;
}


输出结果:


 

2.有参数传递(C++->Lua)

同上方法,建立项目,新建 add.lua 文件:

1

2

3

function add ( x, y )

return x + y

end

CPP代码为:

C++

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

42

43

44

45

46

47

48

#include <stdio.h>
 
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
 
 
/* the Lua interpreter */
lua_State* L;
 
int main ( int argc, char *argv[] )
{
int sum;
/* initialize Lua */
L = luaL_newstate();
 
/* load Lua base libraries */
luaL_openlibs(L);
 
/* load the script */
luaL_dofile(L, "add.lua");
/* the function name */
lua_getglobal(L, "add");
 
/* the first argument */
lua_pushnumber(L, 41 );
 
/* the second argument */
lua_pushnumber(L, 22 );
 
/* 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);
 
/* print the result */
printf( "The result is %d\n", sum );
 
/* cleanup Lua */
lua_close(L);
 
return 0;
}


运行结果:


https://blog.csdn.net/bbhe_work/article/details/48950175

https://www.kancloud.cn/thinkphp/lua-guide/43809




【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。