lua与C++整合并互相调用

本文详细介绍了如何在C++中安装lua源码,配置并整合lua头文件和动态库,以及如何通过C++调用lua脚本和实现双向交互。包括了从lua的安装、环境配置到C++代码示例的全过程。
摘要由CSDN通过智能技术生成

整合步骤

安装lua源码

  • lua整合需要依赖lua头文件及lua的动态链接库,这里需要下载和安装lua源码
  • 操作脚本,这里采用相关文档较多的5.3版本lua
curl -R -O http://www.lua.org/ftp/lua-5.3.6.tar.gz
tar zxf lua-5.3.6.tar.gz
cd lua-5.3.6
  • 执行make之后有提示
  • 按照平台类型选择平台参数,本人用macos,所以执行 make macosx
  • 之后执行make install来进行lua的安装,如果提示没有权限则采用sudo执行

  • 执行之后可以看到 lua相关.h 文件安装到/usr/local/include中,lua命令安装到 /usr/local/bin目录中,动态链接库 liblua.a 安装到/usr/local/lib中。 linux环境路径不同,不过与mac类似。
  • 之后验证一下
    • 执行lua命令

    • lua头文件

    • lua动态链接库

C++调用lua脚本

  • lua_test.cpp(src/luaExam/lua_test.cpp · wang55www/cppexam - Gitee.com)
    extern "C" {
          #include "include/lua.h"
          #include "include/lauxlib.h"
          #include "include/lualib.h"
    }
    #include <iostream>
    
    /*
     * 编译样例
     * g++ lua_test.cpp -o lua_test.exe -L/usr/local/lib -llua -ldl -I/usr/local
     * */
    
    bool run(lua_State* L, std::string in_data) {
      lua_getglobal(L, "interpreter");
      lua_pushstring(L, in_data.c_str());
      lua_call(L, 1, 1);
      return lua_toboolean(L, -1);
    }
    
    int main(int argc, char* argv[]) {
      lua_State* L = luaL_newstate();  // 初始化
      luaL_openlibs(L);  //
      if (luaL_loadfile(L, argv[1]) || lua_pcall(L, 0, 0, 0)) {
        std::cout << "error: " << lua_tostring(L, -1) << std::endl;
        return 0;
      }
      std::cout << run(L, "print('123123') return 2 < 3 and 4 < 6") << std::endl;
      return 0;
    }
  • test.lua(src/luaExam/test.lua · wang55www/cppexam - Gitee.com)
    function interpreter(in_str)
    	return load(in_str)()
    end
  • 执行g++进行编译,这里要指定动态链接库,及include的地址
  • g++ lua_test.cpp -o lua_test.exe -L/usr/local/lib -llua -ldl -I/usr/local
  • 执行验证:
    • C++调用test.lua脚本,执行interpreter函数,此函数可以动态执行一段lua脚本,而c++传入的是 27行中一段lua代码。 print('123123') return 2 < 3 and 4 < 6
    • 执行结果

lua调用C++

  • 参考:三、Lua调用C++函数 - 知乎
  • lua_test2.cpp(src/luaExam/lua_test2.cpp · wang55www/cppexam - Gitee.com)
  • extern "C" {
          #include "include/lua.h"
          #include "include/lauxlib.h"
          #include "include/lualib.h"
    }
    #include <iostream>
    
    /*
     * 编译样例
     * g++ lua_test2.cpp -o lua_test2.exe -L/usr/local/lib -llua -ldl -I/usr/local
     * */
    
    
    static int Average(lua_State *L)
    {
    	std::cout << "test" << std::endl;
    	int n = lua_gettop(L);
    	double sum=0;
    
    	for(int i=1;i<=n;++i)
    	{
    		sum+=lua_tonumber(L,i);
    	}
    
    	lua_pushnumber(L, sum/n);
    	lua_pushnumber(L, sum);
    
    	return 2;
    }
    
    static int testFunc(lua_State *L)
    {
    	std::cout << "Test func" << std::endl;
    	return 0;
    }
    
    int main(int argc, char* argv[]) {
      lua_State* L = luaL_newstate();
      luaL_openlibs(L);  //
      lua_register(L,"average",Average);
      lua_register(L,"testFunc",testFunc);
      luaL_dofile(L, argv[1]);
    
      lua_close(L);
    
      printf("Press enter to exit ....");
    
      getchar();
    
      return 0;
    }
    • C++向lua执行环境中注册了两个函数 分别是 average及testFunc,接下来使用lua脚本来调用这两个函数
  • test2.lua(src/luaExam/test2.lua · wang55www/cppexam - Gitee.com)
    print "Hello,Lua!"
    
    --调用testFunc
    testFunc("test");
    --调用average
    avg,sum=average(10,20,30,40,50);
    
    print("The average is", avg);
    
    print("The sum is", sum);

  • 执行g++进行编译,这里要指定动态链接库,及include的地址
 g++ lua_test2.cpp -o lua_test2.exe -L/usr/local/lib -llua -ldl -I/usr/local
  • 验证结果,test2.lua脚本中执行了C++两个函数

相关链接

lua:The Programming Language Lua

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wp500

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值