在C++中使用Lua

 1. 下载Lua源码
Lua源码下载地址 http://www.lua.org/download.html

 

2. 创建Lua静态库
在vs2008中创建一个静态库项目(我创建的叫LuaLib),注意:
一定要取消“预编译头”选项;(否则会报一大堆有关stdafx.h的错误,也可以稍后自行更改设置)
建成后将Lua源码的.h和.c加入该项目
进入项目属性,修改编译输出,方便其他项目使用lib库
配置属性->常规->输出目录,设置为“$(SolutionDir)\lib\”
配置属性->管理员->常规->输出文件,设置为“$(OutDir)\$(ProjectName)_d.lib”
编译,有一些警告,可以不用管
在Lualib文件夹下的lib文件中有输出的lualib_d.lib

 

3. 创建Test
在LuaLib解决方案中新建Win32控制台程序testLua

 

4. 引入前面生产的Lualib库
进入testLua项目属性
配置属性->C/C++->常规->附加包含目录,设置为“..\..\src”
配置属性->链接器->常规->附加库目录,设置为“..\lib\”
配置属性->链接器->输入->附加依赖项,设置为“Lualib_d.lib”
同时还需要将Lua源码中的以下几个头文件放在lib文件夹中,方便项目引用
lauxlib.h
lua.h
luaconf.h
lualib.h

 

5. 编写C++代码

#include "stdafx.h"  
  1. #include <iostream>  
  2. #include <string>  
  3. using namespace std;  
  4.   
  5. extern "C"  
  6. {  
  7. #include "lua.h"  
  8. #include "lualib.h"  
  9. #include "lauxlib.h"  
  10. }  
  11.   
  12. int fcAdd(lua_State *lu)  
  13. {  
  14.     int a = lua_tointeger(lu, 1);  
  15.     int b = lua_tointeger(lu, 2);  
  16.     lua_pushnumber(lu, a+b);    //结果压栈  
  17.     return 1;           //返回1个结果  
  18. }  
  19.   
  20. int _tmain(int argc, _TCHAR* argv[])  
  21. {  
  22.     int nret = 0;  
  23.     lua_State *lu = luaL_newstate();  
  24.     luaL_openlibs(lu);  
  25.       
  26.     //栈操作  
  27.     lua_pushinteger(lu, 2);  
  28.     lua_pushinteger(lu, 3);  
  29.     int n = lua_tointeger(lu, 1);  
  30.     n = lua_tointeger(lu, 2);  
  31.     int nStack = lua_gettop(lu);  
  32.     lua_pop(lu, 2);  
  33.     nStack = lua_gettop(lu);  
  34.       
  35.     //执行内存脚本  
  36.     string str = "print (\"Hello world!\")";  
  37.     luaL_loadbuffer(lu, str.c_str(), str.length(), "line");  
  38.     lua_pcall(lu, 0,0,0);  
  39.   
  40.     //加载脚本中定义的变量  
  41.     nret = luaL_dofile(lu, "..\\scripts\\test.lua");  
  42.   
  43.     lua_getglobal(lu, "aa");  
  44.     lua_getglobal(lu, "bb");  
  45.     int bb = lua_tointeger(lu, -1);  
  46.     int aa = lua_tointeger(lu, -2);  
  47.       
  48.     //执行脚本中定义的无参函数  
  49.     lua_getglobal(lu, "hello");  
  50.     nret = lua_pcall(lu, 0,0,0);  
  51.       
  52.     //执行脚本中定义的有参函数  
  53.     lua_getglobal(lu, "fadd");  
  54.     lua_pushnumber(lu, aa);  
  55.     lua_pushnumber(lu, bb);  
  56.     nret = lua_pcall(lu, 2,1,0);  
  57.   
  58.     if (nret != 0)  
  59.     {  
  60.         const char *pc = lua_tostring(lu, -1);  
  61.         cout << pc;  
  62.     }  
  63.     else  
  64.     {  
  65.         nret = lua_tointeger(lu, -1);  
  66.         cout << "调用脚本函数:" << endl;  
  67.         cout << aa << " + " << bb << " = " << nret << endl;  
  68.         lua_pop(lu, 1);  
  69.     }  
  70.   
  71.     //脚本中调用C++函数  
  72.     lua_pushcfunction(lu, fcAdd);  
  73.     lua_setglobal(lu, "fcAdd");  
  74.   
  75.     lua_getglobal(lu, "fc");  
  76.     lua_pushnumber(lu, aa);  
  77.     lua_pushnumber(lu, bb);  
  78.     nret = lua_pcall(lu, 2,1,0);  
  79.   
  80.     if (nret != 0)  
  81.     {  
  82.         const char *pc = lua_tostring(lu, -1);  
  83.         cout << pc;  
  84.     }  
  85.     else  
  86.     {  
  87.         nret = lua_tointeger(lu, -1);  
  88.         cout << "调用C++函数:" << endl;  
  89.         cout << aa << " + " << bb << " = " << nret << endl;  
  90.         lua_pop(lu, 1);  
  91.     }  
  92.       
  93.     lua_close(lu);  
  94.     std::system("pause");  
  95.     return 0;  
  96. }  

 

6.  Lua脚本代码

在LuaLib文件夹下创建scripts文件夹,在其中创建test.lua,代码如下:

aa=2;  
  1. bb=3;  
  2. function hello(a,b)  
  3.  print ("Hello in script!")  
  4. end  
  5. function fadd(a,b)  
  6.  return a+b  
  7. end  
  8. function fc(a,b)  
  9.   return fcAdd(a,b)  
  10. end  

posted on 2012-01-16 10:51  Hibernate4  阅读(1049)  评论(0编辑  收藏  举报

导航