• C/C++ 如何调用Lua脚本,C/C++与 Lua的交互


    分为linux下和windows平台下:

    前置工作,准备好lua安装包。

    方法一(linux):

    依次使用以下命令
    得到安装包:
    wget http://www.lua.org/ftp/lua-5.2.0.tar.gz
    解压缩:
    tar zxf lua-5.2.0.tar.gz
    进入安装包
    cd lua-5.2.0
    make linux
    make install

    如遇到readline相关问题
    apt-get install libreadline-dev

    方法二(windows):

    在这个网址下载好lua安装包。
    http://www.lua.org/download.html
    windows下需要做一些配置,用于链接静态库或动态库,所以不能光下载安装包
    可在以下网站下载,提取处lib 和 include 文件夹。
    https://github.com/rjpcomputing/luaforwindows githuab

    我自己已经把这些需要的工具都下载好了
    lua安装包以及lib库,include头文件都在这。
    链接:https://pan.baidu.com/s/1uxpheOsYiqnbMdBO2hCXzA?pwd=h588
    提取码:h588

    测试代码

    需要一个.lua文件,一个c或者cpp文件

    hello.lua

    str = "i am so cool"
    tbl = {name = "shun", id = 2020104}
    function add(a, b)
        return a + b
    end
    print("nihao")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    test.cpp

    #include 
    #include 
    #include 
    using namespace std;
    
    int main() {
        lua_State* L = luaL_newstate(); //lua_open();
    	luaL_openlibs(L);   //必不可少
        //加载lua文件
        int bRet = luaL_loadfile(L, "hello.lua");
        if (bRet) {
            cout << "load file error" << endl;
            return  0;
        }
        //运行lua文件
        bRet = lua_pcall(L, 0, 0, 0);
        if (bRet) {
            cout << "pcall error" << endl;
            return  0;
        }
    
        //读取变量
        lua_getglobal(L, "str");
        string str = lua_tostring(L, -1);
        cout << "str = " << str.c_str() << endl; // str =  I am so cool
    
        //读取table
        lua_getglobal(L, "tbl");
        lua_getfield(L, -1, "name");
        str = lua_tostring(L, -1);
        cout << "tbl:name = " << str.c_str() << endl;
        //读取函数
        lua_getglobal(L, "add");
        lua_pushnumber(L, 10); //压入第一个参数
        lua_pushnumber(L, 20); //压入第二个参数
        int iRet = lua_pcall(L, 2, 1, 0); //调用参数, 调用完以后,会将值压入栈中
        // 2表示参数个数, 1表示返回结果个数,返回的结果会压入栈中
    
        if (iRet) {
            const char* pErrorMsg = lua_tostring(L, -1);
            cout << pErrorMsg << endl;
            lua_close(L);
            return  0;
        }
    
        if (lua_isnumber(L, -1)) {//取值输出
            double fValue = lua_tonumber(L, -1);
            cout << "Result is " << fValue << endl;
    
        }
        return 1;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    Linux下比较简单:

    完成以上方法一的配置后
    将以上的hello.lua 和 test.cpp放在一个目录下,直接使用命令
    g++ test.cpp -llua -ldl -o test
    运行
    ./test 即可看到效果。

    Windows下:

    我使用的vs2019
    创建一个windows桌面向导下的控制台程序工程,将hello.lua, test.cpp, 都加入这个功能,当然lib和include也可以放进来(不是必须的,后边使用它们的时候只需要得到它们路径即可)
    1:将刚才下载的include文件的路径放到红框里
    在这里插入图片描述
    2:将刚才下载的lib目录放进去
    在这里插入图片描述

    3:在这里写入lib库文件的名字,名字自己在lib文件里找,这里是lua5.1.lib
    当然,这步不是必须的,你也可以直接在代码编辑区写上

    #pragma comment(lib,"lua5.1.lib")  //一样的效果。
    
    • 1

    在这里插入图片描述
    如果使用的是静态库方法到此为止就可以了,但以上的测试用到了动态库,如果你直接运行它会告诉你找不到…dll文件,这时在lib文件中找到lua5.1.dll ,复制一份到当前工程这一层级下(打开工程目录的那一层级),到此为止,即可运行。

    这里只是 C/C++ 调用lua,去这一篇学习lua调用C/C++(点我)
    若有疑问,欢迎评论区留言讨论~

  • 相关阅读:
    【SpringBoot】静态资源导入探究
    数学小抄:线性回归与协方差
    Spring5 框架新功能
    noip2012Vigenère 密码
    pytorch深度学习实战lesson6
    【面试】C++和python的区别
    Android 应用更新提醒自动跳转安装
    Rust 从入门到精通03-helloword
    zynq qemu模拟器环境搭建
    Flet教程之 12 Stack 重叠组建图文混合 基础入门(教程含源码)
  • 原文地址:https://blog.csdn.net/qq_51721904/article/details/126770382