Linux下Lua和C++交互

这篇具有很好参考价值的文章主要介绍了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
Linux下Lua和C++交互,linux,lua,c++
直接cd 到 lua-5.4.6中,执行 make 直接编译 ,会生成liblua.a
Linux下Lua和C++交互,linux,lua,c++

c++测试程序源码

首先将lua源码中的所有.h头文件和生成的liblua.a 复制到源码所在目录
Linux下Lua和C++交互,linux,lua,c++
main.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 源码

--传字符串
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
Linux下Lua和C++交互,linux,lua,c++
运行a.out
Linux下Lua和C++交互,linux,lua,c++文章来源地址https://www.toymoban.com/news/detail-568045.html

到了这里,关于Linux下Lua和C++交互的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • lua与c#交互篇

    C# Call Lua :由C#文件先调用Lua解析器底层dll库(由C语言编写),再由dll文件执行相应的Lua文件; Lua Call C# : Wrap方式:首先生成C#源文件所对应的Wrap文件,由Lua文件调用Wrap文件,再由Wrap文件调用C#文件; C# Call Lua:C#把请求或数据放在栈顶,然后lua从栈顶取出该数据,在lua中做出

    2024年02月16日
    浏览(36)
  • Lua与Java的交互方案

    Lua 和 Java 之间的交互可以通过多种方式实现,每种方式都有其优点和适用场景。以下是几种常见的方案: 1. JNI(Java Native Interface) JNI 是 Java 提供的一种标准编程接口,它允许 Java 代码与本地应用程序或库(例如 C/C++ 编写的程序)进行交互。通过 JNI,你可以编写本地方法来

    2024年04月23日
    浏览(39)
  • Lua与C#交互初析

    项目是全Lua开发,导致的其中一个结果是会遇到lua的gc性能问题。而且相对于C#这种强类型语言,Lua因为其自由性,对于团队后期维护还是有一定的成本,不做好代码复审,相对不好维护。这个时候就需要我们自主了解Lua和C#交互的底层逻辑和实现原理,用以之后在lua测开发的

    2024年02月03日
    浏览(41)
  • Lua:面向对象/C之间的交互

    前段时间对平台的任务感兴趣,其要求是一周内12篇博文,尝试了之后发现还是太敷衍了,之后还是回归到内容本身上来,尽量保证一篇博文的内容能涵盖足够多的知识点或者足够深的思考成分。 面向对象主要有三个方面:封装、继承和多态。Lua若做到了这三点,则认为是也

    2024年02月20日
    浏览(33)
  • lua的用户数据的使用与c语言交互

    在 Lua 中,用户数据(userdata)是一种特殊的数据类型,它可以用来表示外部的 C 或 C++ 对象,并将它们传递给 Lua 程序使用。用户数据是 Lua 与其他语言或系统进行交互的主要方式之一,它可以让 Lua 程序与其他语言或系统进行无缝的集成。 用户数据的使用一般分为以下几个步

    2024年02月09日
    浏览(34)
  • Lua常用C API与C/C++交互

    1、基础概念 1. states Lua连接库是完全可重入的,因为它没有全局变量。Lua解释器的整个state(如全局变量、堆栈等)都存储在一个结构类型为Lua_State动态分配的对象里。指向这一对象的指针必须作为第一个参数传递给所有连接库的API,除了用来生成一个Lua state的函数——lua_

    2024年02月02日
    浏览(38)
  • 探秘pLua:轻量级的Python与Lua交互库

    项目地址:https://gitcode.com/esrrhs/pLua 在软件开发中,选择合适的编程语言往往能大大提高效率。而pLua就是这样一款工具,它允许你在Python项目中无缝集成和执行Lua代码,为你的应用带来灵活性和高性能的可能性。 pLua 是一个小型但功能强大的Python模块,由开发者esrrhs创建。它的

    2024年04月16日
    浏览(51)
  • cocos2d-x Android原生平台与Lua交互

    版本: cocos2d-x 语言: C++/Java/Lua cocos2d-x原生平台Android 接入第三方SDK, 需要了解 LuaJavaBridge 的使用。 它封装了用于 Java 和 Lua 的相互调用, 其调用通过 C++ 为中介,简要的流程: Lua调用Java: Lua - C++ - Java Java调用Lua: Java - C++ - Lua 以此方式来实现数据的交互, 接下来我们分别说下

    2024年02月08日
    浏览(49)
  • C++系列十:其他-1. Lua

    我写这个博客的一个问题?(●’◡’●) 居然是 取名太难了。 其实都是摘抄,用vscode ,写了几行代码,写下聊表心意哈。 学习太累了,我要躺平…… 脚本语言! 安装参考、 嗨客网、 菜鸟教程 C++调用lua

    2024年02月13日
    浏览(36)
  • 【Lua学习笔记】Lua入门

    (不是教程,推荐有编程基础的人观看本文) 文中主要包含了对菜鸟教程中的一些学习理解,个人感觉Lua语言和Python很多地方相似 以下大部分代码和表格摘抄自菜鸟教程 数据类型 描述 nil 只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)(类似与Null或者

    2024年02月15日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包