C++调用Lua代码

时间:2022-09-22 09:25:14

这里是指linux下的调用。C与C++调用Lua略有不同,体现在:

1.头文件包含的方法

C中直接include 

1 #include <lua.h>
2 #include <lualib.h>
3 #include <lauxlib.h>

c++中要加extern "C"

1 extern "C"
2 {
3 #include <lua.h>
4 #include <lualib.h>
5 #include <lauxlib.h>
6 }

2.编译选项的不同

gcc -o xxx xxx.c -llua -ldl -lm

g++ -o xxx xxx.cpp -llua -ldl

 

下面是一个简单的C++调用Lua代码方法示例

lua代码(文件名为luafun.lua)

1 function add(x)
2     print('luafun,x=',x)
3 end

C++代码,这里注释部分说明了一些可替代的调用

 1 #include<iostream>
 2 using namespace std;
 3 
 4 extern "C"
 5 {
 6 #include"lua.h"
 7 #include"lauxlib.h"
 8 #include"lualib.h"
 9 }
10 
11 #define my_lua_dofile(L, filename) (luaL_loadfile((L), (filename)) || lua_pcall((L), 0, LUA_MULTRET, 0))
12 
13 lua_State *GlobalL;
14 
15 int main()
16 {
17     GlobalL = luaL_newstate();
18     int x = 10;
19 
20     lua_gc(GlobalL, LUA_GCSTOP, 0);
21     luaL_openlibs(GlobalL);
22     lua_gc(GlobalL, LUA_GCRESTART, 0);
23 
24     //luaL_dofile(GlobalL, "luafun.lua");//执行lua文件
25     
26     int loaderr = luaL_loadfile(GlobalL, "luafun.lua");
27     cout<<"loaderr="<<loaderr<<endl;
28     lua_pcall(GlobalL, 0, LUA_MULTRET, 0);
29     //my_lua_dofile(GlobalL, "luafun.lua");//代替上面三行
30 
31     lua_getfield(GlobalL, LUA_GLOBALSINDEX, "add");
32     //lua_getglobal(GlobalL, "add");//代替上面一行
33     
34     lua_pushnumber(GlobalL, x);//参数
35     int callerr = lua_pcall(GlobalL, 1, 0, 0);
36     cout<<"callerr="<<callerr<<endl;
37     cout<<lua_tostring(GlobalL, -1)<<endl;
38 
39     lua_close(GlobalL);
40 }

而实际上,直接这样用太过繁琐,因为要为每个lua函数单独写参数列表等内容,所以有不少人对此做了一些封装,可参考:http://blog.csdn.net/nightfallrove/article/details/5729636。另外g++编译的时候注意编译选项。