天天看点

c/c++混编,导出接口给lua调用lua注册文件 lnetReg.c编写lua dll动态库编写lua lib静态库

最主要是为了使用c++11的里面的一些东西,但这c11的东西又不能直接被lua调用,必须使用c还做 媒人
  • lua注册文件 lnetRegc
  • 编写lua dll动态库
  • 编写lua lib静态库

lua注册文件 lnetReg.c

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

#define LUA_API_EXPORT __declspec(dllexport) 

extern bool Connect(const char* _ip, int _port); //在C文件中不需要 "C",实现在gameNet.cpp中
static int
lconnect(lua_State *L) {
    size_t sz = 0;
    const char* ip = luaL_checklstring(L, 1, &sz);
    int port = luaL_checkinteger(L, 2);
    bool ret = Connect(ip, port);
    lua_pushboolean(L, ret);
    return 1;
}

LUA_API_EXPORT int
luaopen_network(lua_State *L) {
    luaL_checkversion(L);
    luaL_Reg l[] = {
        { "connect", lconnect },
        { NULL, NULL },
    };
    //luaL_newlib(L, l);
    lua_newtable(L);
    luaL_openlib(L, "network", l, 0);
    return 1;
}

在gameNet.cpp文件中
extern "C" {
    bool Connect(const char* _ip, int _port)
    {
        return CGameNet::GetInstance()->Connect(_ip, _port);
    }
}           

然后gameNet.cpp 和 gameNet.h 就可以正常使用c++11的东西来写,上面作为一个接口提供个 c 编译

编写lua dll动态库

编译选项:

1. 配置属性-常规-目标文件扩展名 改成 .dll
2. 配置属性-常规-配置类型 改为 动态库
           
LUA_API_EXPORT int //LUA_API_EXPORT __declspec(dllexport) 导出动态库接口
luaopen_sproto_core(lua_State *L) { //lua中require "sproto_core"
#ifdef luaL_checkversion
    luaL_checkversion(L);
#endif
    luaL_Reg l[] = {
        { "newproto", lnewproto },
        { NULL, NULL },
    };
    luaL_newlib(L,l);           

lua中

local core = require “sproto_core” 
core.newproto(bin)           

编写lua lib静态库

1. 配置属性-常规-目标文件扩展名 改成 .lib
2. 配置属性-常规-配置类型 改为 静态库
           

在创建luastate的地方声明

extern "C" {
    int luaopen_srp(lua_State *L);
}

lua_State* L = engine->getLuaStack()->getLuaState();
luaopen_srp(L); //注册进lua中

LUA_API_EXPORT int
luaopen_srp(lua_State *L) {
    luaL_checkversion(L);
    luaL_Reg l[] = {
        { "create_verifier", lcreate_verifier },
        { NULL, NULL },
    };
    //luaL_newlib(L, l);
    lua_newtable(L);
    luaL_openlib(L, "srp", l, 0); //lua中require "srp"   
    return 1;
}           

lua中

local srp = require(“srp”) 
local private_key, public_key = srp.create_client_key()           

PS: 如果该库中引用到xxx.lib,在需要在引用到这个srp.lib的工程中引入xxx.lib,否则报链接错误2019

a

继续阅读