tolua_runtime混合编译自己实现的c++代码

使用lua作为游戏热更新方案时 编译tolua就变得尤为重要 如果自己想要写一些c接口也可以编译到tolua.dll中 lua中直接调用

编译tolua_runtime 有好多大佬都写了很详细的文章 这边直接引用

这是我新增加cpp代码
在这里插入图片描述
代码实现了一个简单的读取文件内容

LGlobal.h
#define FRAME_API extern "C" __declspec(dllexport)
#define EXTERN_API extern "C"

extern "C"
{
	#include "lua.h"
	#include "lualib.h"
	#include "lauxlib.h"
	#include "luaconf.h"
}

```cpp
LReadFile.h
#include "LGlobal.h"

FRAME_API void InitFrame(lua_State* L);
LReadFile.cpp
#include "LGlobal.h"
#include <stdio.h>
#include <stdlib.h>
#include <vector>

static int lhh_readfile(lua_State* L)
{
    const char* path = lua_tostring(L, 1);
    FILE* file = fopen(path, "rb");

    if (file != NULL)
    {
        fseek(file, 0, SEEK_END);
        int fileSize = ftell(file);
        fseek(file, 0, SEEK_SET);

        int bufferSize = fileSize + 1;
        char* buffer = (char*)malloc(bufferSize);

        if (buffer != NULL)
        {
            buffer[fileSize] = '\0';

            if (buffer != NULL)
            {
                int result = fread(buffer, 1, fileSize, file);
                lua_pushstring(L, (const char*)buffer);
                free(buffer);
            }
        }

        fclose(file);
    }

    return 1;
}

static const struct luaL_Reg l_tolua_funcs[] =
{
    { "Get", lhh_readfile},
    { NULL, NULL }
};

EXTERN_API void InitFrame(lua_State* L)
{
    luaL_register(L, "lhh", l_tolua_funcs);
}

C#端调用自己逻辑的初始化接口 比如
在这里插入图片描述
在这里插入图片描述

游戏tolua使用的c语言编写 我写的例子是c++语言实现 因为是接口 肯定会用到很多c++的特性 写起来会舒服很多
游戏tolua是c语言实现 编译用的是gcc 如果用来编译c++代码 会报错 有些特性找不到 所以这块就牵扯到了c/c++混合编译
那就先将c++代码编译为.o文件 然后编译tolua的时候链接进去就可以了

这段是编译自己写的c++方法

g++ -m64 -O2 -std=c++11 -c \
 L/LReadFile.cpp \
 -o L/LReadFile.o \
 -I./ \
 -Iluajit-2.1/src \
 -Iluasocket

修改后的build_win64.sh 直接编译即可

#!/bin/bash

# 64 Bit Version
mkdir -p window/x86_64

cd luajit-2.1
mingw32-make clean
mingw32-make BUILDMODE=static CC="gcc -m64 -O2" XCFLAGS=-DLUAJIT_ENABLE_GC64
cp src/libluajit.a ../window/x86_64/libluajit.a
mingw32-make clean
cd ..

g++ -m64 -O2 -std=c++11 -c \
 L/LReadFile.cpp \
 -o L/LReadFile.o \
 -I./ \
 -Iluajit-2.1/src \
 -Iluasocket

gcc -m64 -O2 -std=gnu99 -shared \
 L/LReadFile.o \
 tolua.c \
 int64.c \
 uint64.c \
 pb.c \
 lpeg.c \
 struct.c \
 cjson/strbuf.c \
 cjson/lua_cjson.c \
 cjson/fpconv.c \
 luasocket/auxiliar.c \
 luasocket/buffer.c \
 luasocket/except.c \
 luasocket/inet.c \
 luasocket/io.c \
 luasocket/luasocket.c \
 luasocket/mime.c \
 luasocket/options.c \
 luasocket/select.c \
 luasocket/tcp.c \
 luasocket/timeout.c \
 luasocket/udp.c \
 luasocket/wsocket.c \
 -o Plugins/x86_64/tolua.dll \
 -I./ \
 -Iluajit-2.1/src \
 -Iluasocket \
 -lws2_32 \
 -Wl,--whole-archive window/x86_64/libluajit.a -Wl,--no-whole-archive -static-libgcc -static-libstdc++

编译完之后 tolua.dll替换掉LuaFramework里面的dll即可

写个测试脚本调用我们的Main.lua Main.cs脚本挂载到场景中 运行即可

using UnityEngine;
using System.Collections;


/// <summary>
/// </summary>
public class Main : MonoBehaviour
{
    void Start()
    {
        LuaInterface.LuaState luaState = new LuaInterface.LuaState();
        luaState.Start();

        luaState.DoFile("Main.lua");
        luaState.Call("Main", true);
    }
}

lua中写一个方法调用上面写的c++代码

function Main()					
	local sStr = lhh.Get("D:\\UnityProject\\LuaFramework\\Temp.txt")
	print("info: "..sStr)
end

temp文本内容
在这里插入图片描述

运行结果
在这里插入图片描述
打完收工

如果想实现一些底层库 都可以这样实现 然后注册到lua虚拟机中 代码里直接调用即可 高性能低成本

该测试项目上传到 github了 仅供参考
地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值