Linux下Lua和C++交互

前言

lua(wiki 中文 官方社区:lua-users)是一门开源、简明、可扩展且高效的弱类型解释型脚本语言。

由于其实现遵循C标准,它几乎能在所有的平台(windows、linux、MacOS、Android、iOS、PlayStation、XBox、wii等)上运行。

在Lua中,函数是对语句和表达式进行抽象的主要方法。既可以用来处理一些特殊的工作,也可以用来计算一些值。

Lua 提供了许多的内建函数,你可以很方便的在程序中调用它们,如print()函数可以将传入的参数打印在控制台上。

Lua 函数主要有两种用途:

1.完成指定的任务,这种情况下函数作为调用语句使用;

2.计算并返回值,这种情况下函数作为赋值语句的表达式使用。

下面简单总结, lua源码编译,lua脚本与C++交互。

源码编译lua

lua源码下载地址

这里下载了lua-5.4.6

直接cd 到 lua-5.4.6中,执行 make 直接编译 ,会生成liblua.a

c++测试程序源码

首先将lua源码中的所有.h头文件和生成的liblua.a 复制到源码所在目录

main.cpp 源码

cpp 复制代码
#include <iostream>
#include <vector>
extern "C"
{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
lua_State* g_pLuaStateEx = NULL;

int Test(lua_State* L)
{
        int n = lua_gettop(L);
        if( n != 1){
                lua_pushboolean(g_pLuaStateEx, 0);
                return 1;
        }
        std::string str = lua_tostring(L, 1);
        std::cout << "Test:" << str << std::endl;
        return 0;
}

bool InitLuaEnv()
{
        g_pLuaStateEx = luaL_newstate();
        luaL_openlibs(g_pLuaStateEx);
        //注册脚本调用函数
        lua_register(g_pLuaStateEx, "Test", Test);
        return true;
}

bool LoadLuaFile(const std::string &luaFile)
{
        int re = luaL_dofile(g_pLuaStateEx, luaFile.c_str());
        if(re){
                const char* pStr = lua_tostring(g_pLuaStateEx, -1);
                if(pStr){
                        std::cerr << pStr << std::endl;
                }
                return false;
        }
        return true;
}
bool CallLuaString(const std::string &str)
{
        std::string strFun = "ParseString";

        lua_getglobal(g_pLuaStateEx, strFun.c_str());
        lua_pushstring(g_pLuaStateEx, str.c_str());
        lua_call(g_pLuaStateEx, 1, 1);
        lua_pop(g_pLuaStateEx, 1);
        return true;
}

bool CallLuaVec(std::vector<std::string> argvs)
{
        std::string strFun = "ParseVec";

        lua_getglobal(g_pLuaStateEx, strFun.c_str());
        lua_newtable(g_pLuaStateEx);
        for(int i=0; i < argvs.size(); i++){
                lua_pushinteger(g_pLuaStateEx, i+1);
                lua_pushstring(g_pLuaStateEx, argvs[i].c_str());
                lua_settable(g_pLuaStateEx, -3);
        }
        lua_call(g_pLuaStateEx, 1, 1);
        lua_pop(g_pLuaStateEx, 1);
        return true;
}

int main(int argc, char* argv[])
{
        //初始化lua脚本
        if(!InitLuaEnv()){
                std::cerr << "Init lua faild!" << std::endl;
        }
        //加载lua脚本
        if(!LoadLuaFile("test.lua")){
                std::cerr << "Init lua faild!" << std::endl;
        }

        //调用lua脚本函数
        if(!CallLuaString("Man call lua ParseString string: xxxx")){
                std::cerr << "CallLuaString error!" << std::endl;
        }

        std::vector<std::string> vec;
        vec.push_back("man call lua ParseVec arg1: test1");
        vec.push_back("man call lua ParseVec arg1: test2");
        vec.push_back("man call lua ParseVec arg1: test3");
        //调用lua脚本函数
        if(!CallLuaVec(vec)){
                std::cerr << "CallLuaVec error!" << std::endl;
        }
        return 0;
}

test.lua 源码

cpp 复制代码
--传字符串
function ParseString(commands)
        print("ParseString:"..commands);
        Test("lua call man Test!");
end
--传数组
function ParseVec(commands)
        print("ParseVec:");
        for i=1,#(commands) do
                print(commands[i]);
        end
        Test("lua call man Test!"); 
end

编译测试程序源码,执行 g++ main.cpp liblua.a -ldl -lm 生成a.out

运行a.out

相关推荐
闻缺陷则喜何志丹7 分钟前
【组合数学 动态规划】P6870 [COCI2019-2020#5] Zapina|普及+
c++·数学·算法·动态规划·组合数学
CoderCodingNo10 分钟前
【GESP】C++五级真题(贪心考点) luogu-B3872 [GESP202309 五级] 巧夺大奖
开发语言·c++
唐·柯里昂79814 分钟前
[rk3566AI模型部署]泰山派buildroot部署yolov5 使用rknn_model_zoo
c语言·c++·笔记·yolo·rk3566·瑞芯微·泰山派
图形学爱好者_Wu15 分钟前
每日一个C++知识点|const和static的区别
c++
xuhe217 分钟前
[重磅更新] 支持最新 Overleaf 6.x!我的私有化部署方案 xuhe2/sharelatex-ce 迎来大升级
linux·docker·github·科研·overleaf
zhuzewennamoamtf20 分钟前
Linux驱动实现DMA支持
linux·spring boot·spring
一个平凡而乐于分享的小比特23 分钟前
硬链接(ln) vs 复制(cp)的详细区别
linux·复制·硬链接·cp·ln
郝学胜-神的一滴28 分钟前
Linux 多线程编程:深入理解 `pthread_join` 函数
linux·开发语言·jvm·数据结构·c++·程序人生·算法
Trouvaille ~30 分钟前
【C++篇】C++11新特性详解(二):右值引用与移动语义
c++·stl·基础语法·右值引用·默认成员函数·完美转发·移动语义
罗湖老棍子30 分钟前
瑞瑞的木板(洛谷P1334 )
c++·算法·优先队列·贪心·哈夫曼树