首页 > 其他分享 >游戏开发:移植golang共享库 for lua

游戏开发:移植golang共享库 for lua

时间:2024-03-23 14:34:38浏览次数:22  
标签:transit golang lua Signature go 共享 include 移植

一些奇奇怪怪的尝试 :)随笔记录下

将golang模块导出为共享库供lua使用(一般用于功能模块适配和迁移),这里给出一个借助c语言实现中间层通信的方案(不要问我为什么不使用ffi)。

假设使用go实现底层模块core,export相关API(如下例的G_Signature)供外部使用,这里是被C层使用。那么需要将go模块编译成共享库,然后在C代码中调用该共享库中的函数。

// core.go

package main

import "C"
import "fmt"

const SIGNATURE = "LINXX"
const VERSION = "0.1"

//export G_Signature
func G_Signature() *C.char {
    raw_signature := fmt.Sprintf("%s [V-%s]", SIGNATURE, VERSION)
    return C.CString(raw_signature)
}

func main() {
}

# 编译生成共享库 libcore.so
go build -o libcore.so -buildmode=c-shared core.go

c层担任转发调用请求的责任,编译生成共享库提供给lua使用,那么c需要遵循c-lua的通信格式实现。如下:

//lua-transit.c

#include <stdlib.h>
#include <stdint.h>
#include <stddef.h>

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

// 定义Golang模块中的G_Signature函数
extern char * G_Signature();

int
lsignature(lua_State *L) {
    // 调用Golang模块中的G_Signature函数
    char * sign = G_Signature();
    printf("signature: %s\n", sign);
    return 0;
}

LUAMOD_API int
luaopen_transit(lua_State *L) {
    luaL_checkversion(L);

    luaL_Reg l[] = {
        { "signature", lsignature },
        { NULL, NULL },
    };
    luaL_newlib(L, l);

    return 1;
}

# 编译生成共享库 transit.so
gcc -g -Wall lua-transit.c -o transit.so -fPIC --shared -I./3rd/lua -L. -lcore -lpthread -ldl -Wl,-rpath=.

lua层通过require c-lib实现对模块的使用;

local transit = require("transit")
transit.signature()

方案评估:

性能开销:这里有两层交互造成的性能开销,go和c的交互、c与lua的交互。

标签:transit,golang,lua,Signature,go,共享,include,移植
From: https://www.cnblogs.com/linxx-/p/18091096

相关文章

  • lua/c开发:c库共享运行时状态
    场景是多个c扩展库(forlua)之间需要共享运行时的状态数据,期望是不使用lua逻辑介入;记录一个方案:通过lua全局注册表C扩展库中一些数据通过全局注册表放入lua状态机。最方便且能保证唯一性的key是一个lightuserdata。使用一个static变量的地址作为key在注册表做索引保存需要......
  • lua/c开发:c-object for lua
    c+lua开发中常见的实现:c库实现功能,供lua调用;比如排行榜模块(跳表),实现方案可为:c库实现跳表(skiplist)核心逻辑,提供接口供lua层中操作使用;那么c库显然有以下的实现(伪码,演示用)://skiplistcorestructskiplist{//...};structskiplist*skiplist_create();voidskipli......
  • lua/c开发:lua增加自定义require方式
    我们会有需要自定义加载模块逻辑的需求,比如支持从自定义格式数据包中加载一个被加密过的lua文件的方式,这在生产环境中非常常见,可以有效保护源码同时保持整洁;lua模块管理库会从若干个loader中逐个尝试加载模块,lua原生提供了4个loader;staticconstlua_CFunctionsearchers[]={......
  • lua/c开发:只读数据共享方案
    这里只讨论单一进程内的只读数据共享。同一进程内虚拟内存空间是原本就共享的(以C为例),但在业务开发上,一般会嵌入脚本语言,使用VM的沙盒环境独立维护不同的上下文(以lua为例),多个VM之间(暂时称为业务VM)的数据相互独立。业务上涉及数据共享的,一般的场景是优化性能、资源占用的情况。需......
  • 【Golang星辰图】实现弹性微服务架构:使用go-micro和go-kit构建可扩展的网络应用
    构建高效网络应用:探索分布式系统和微服务的利器前言在当今的互联网时代,构建可扩展且可靠的网络应用变得越来越重要。分布式系统和微服务架构成为了解决大规模应用程序开发和管理的有效方法。本文将介绍一些用于构建分布式系统和微服务的关键工具和库,例如go-rpc、go-micro......
  • 8.Golang中的运算符-算术运算符、关系运算符、逻辑运算符、赋值运算符
    Golang中的运算符1、Golang内置的运算符算术运算符关系运算符逻辑运算符位运算符赋值运算符2、算数运算符运算符描述+相加-相减*相乘/相除%求余=被除数-(被除数/除数)*除数注意:++(自增)和--(自减)在Go语言中是单独的语句,并不是运算符。pa......
  • 7.GoLang中基本数据类型之间的转换
    GoLang中基本数据类型之间的转换1、关于golang中的数据类型转换Go语言中只有强制类型转换,没有隐式类型转换。2、数值类型之间的相互转换数值类型包括:整形和浮点型packagemainimport"fmt"funcmain(){varaint8=20varbint16=40varc=int16......
  • Uboot移植(二)
    参考资料:https://www.bilibili.com/video/BV12E411h71h?p=30&vd_source=432ba293ecfc949a4174ab91ccc526d6 1、bootcmdbootcmd保存了着uboot的默认命令,uboot倒计时结束之后就会执行bootcmd中的命令。这些命令一般都是用来启动Linux内核的,比如将EMMC或者flash中的Linux内核镜......
  • [GPT] swoole的协程和golang的协程有什么区别,哪个更好
    Swoole的协程和Golang(Go语言)的协程(Goroutine)在概念上都是为了实现轻量级的并发编程,但它们在具体实现、使用方式和性能特点上有所不同:实现原理:Golang协程(Goroutine):Go语言从语言层面内置了对协程的支持。Goroutine是由Go运行时系统管理的轻量级线程,它基于M:N调度模型......
  • Uboot移植
    一个开发板运行uboot,DDR或者DRAM,串口,SD/EMMC等驱动要存在。这些基本要和原厂一样的 nxp官方uboot下载地址:https://github.com/Freescale/u-boot-fslcnxp官方imx6系统板子介绍:https://www.nxp.com/products/processors-and-microcontrollers/arm-processors/i-mx-applications-......