這里是指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++編譯的時候注意編譯選項。
