MALOUDA-PSA 2024-07-21 08:19 采纳率: 96.7%
浏览 2
已结题

skynet中lua和c++交互

这是 lua-tbl.c


#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
#include <stdio.h>

static int lecho (lua_State *L) {
    const char* str = lua_tostring(L, -1);
    fprintf(stdout, "%s\n", str);
    return 0;
}


static const luaL_Reg l[] = {// 导出给lua使用数组
    {"echo", lecho},
    {NULL, NULL},
};

int luaopen_tbl_c(lua_State *L) { // local tbl = require "tbl.c"
    // 创建一张新的表,并预分配足够保存下数组 l 内容的空间
    luaL_newlib(L, l); 
    return 1;
}

下面是lua代码:

package.cpath = "./?.so" --c库的路径

local so = require "tbl.c"  -- 这里xxx.c  对应 xxx.so 动态库

so.echo("hello world") -- 新的虚拟栈
so.echo("hello world1")-- 新的虚拟栈
so.echo("hello world2")-- 新的虚拟栈

现在问题是: lua-tbl.c 里面要添加vector的c++代码,需要编译为c++, 而不是c, 该怎么处理

  • 写回答

4条回答 默认 最新

  • GISer Liu 2024-07-21 08:20
    关注

    该回答引用自GPT-3.5, 由博主 GISer Liu 编写:

    问题分析

    用户在Skynet框架中使用Lua与C进行交互时,遇到了需要将C代码改为C++代码的问题。具体来说,用户希望在lua-tbl.c文件中添加C++代码,并将其编译为C++动态库,而不是C动态库。

    解决方案

    为了将C代码改为C++代码并编译为C++动态库,需要进行以下步骤:

    1. 修改文件扩展名:将lua-tbl.c文件的扩展名改为.cpp,例如改为lua-tbl.cpp
    2. 修改编译命令:确保编译器使用C++编译器进行编译,并链接C++标准库。
    3. 处理C++与Lua的交互:由于C++和C的名称修饰规则不同,需要使用extern "C"来确保C++编译器不修改函数名,以便Lua能够正确调用C++函数。

    详细步骤

    1. 修改文件扩展名

    lua-tbl.c文件的扩展名改为.cpp,例如改为lua-tbl.cpp

    2. 修改编译命令

    确保使用C++编译器进行编译,并链接C++标准库。例如,使用g++编译器进行编译:

    g++ -shared -o tbl.so lua-tbl.cpp -llua
    

    3. 处理C++与Lua的交互

    lua-tbl.cpp文件中,使用extern "C"来确保C++编译器不修改函数名。修改后的代码如下:

    #include <lua.hpp>
    #include <iostream>
    #include <vector>
    
    extern "C" {
        static int lecho(lua_State *L) {
            const char* str = lua_tostring(L, -1);
            std::cout << str << std::endl;
            return 0;
        }
    
        static const luaL_Reg l[] = {
            {"echo", lecho},
            {NULL, NULL},
        };
    
        int luaopen_tbl_c(lua_State *L) {
            luaL_newlib(L, l);
            return 1;
        }
    }
    

    完整的lua-tbl.cpp代码

    #include <lua.hpp>
    #include <iostream>
    #include <vector>
    
    extern "C" {
        static int lecho(lua_State *L) {
            const char* str = lua_tostring(L, -1);
            std::cout << str << std::endl;
            return 0;
        }
    
        static const luaL_Reg l[] = {
            {"echo", lecho},
            {NULL, NULL},
        };
    
        int luaopen_tbl_c(lua_State *L) {
            luaL_newlib(L, l);
            return 1;
        }
    }
    

    编译命令

    使用g++编译器进行编译:

    g++ -shared -o tbl.so lua-tbl.cpp -llua
    

    总结

    通过以上步骤,您可以将C代码改为C++代码,并将其编译为C++动态库。这样,您就可以在Skynet框架中使用Lua与C++进行交互了。

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 7月29日
  • 已采纳回答 7月21日
  • 创建了问题 7月21日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?