这里是指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++编译的时候注意编译选项。