排查错误
error loading module 'xxx' from file 'xxxx.dll':
lua有自己的入口函数规则lua_open_模块名字,需要匹配,不能随便调整目录结构:
LUASOCKET_API int luaopen_socket_core(lua_State *L) {}
/* prefix for open functions in C libraries */
#define LUA_POF "luaopen_"
#define POF LUA_POF
static const char *mkfuncname (lua_State *L, const char *modname) {
const char *funcname;
const char *mark = strchr(modname, *LUA_IGMARK);
if (mark) modname = mark + 1;
funcname = luaL_gsub(L, modname, ".", LUA_OFSEP);
funcname = lua_pushfstring(L, POF"%s", funcname);
lua_remove(L, -2); /* remove 'gsub' result */
return funcname;
}
mkfuncname 是一个辅助函数,用于构建在 C 函数库中打开指定模块的函数名。它根据模块名生成 C 函数名,并将其格式化为 "luaopen_模块名" 的形式。在 Lua 调用 require 加载 C 函数库时,会调用这个生成的函数来进行初始化。这个函数使用 Lua 的字符串操作函数 luaL_gsub 将模块名中的 "." 替换为当前系统默认的函数名分隔符(通过 LUA_OFSEP 宏定义),然后调用 lua_pushfstring 将函数名压入 Lua 栈中。最后,通过 lua_remove 移除之前调用 luaL_gsub 生成的结果字符串。
一直报错找不到模块
原因是我的lua动态库名字不一致导致
可以看到core.dll依赖的是lua5.1.dll,如果随便将lua模块编译为lua.dll,可能就无法正确加载core.dll
要注意自己编译dll的时候,使用的lua版本,和宿主的lua版本必须一致,一般这种情况发生在分开编译dll和exe时比较容易发生。
lua dll demo
自己写的学习例子,一个最简单的lua dll:
#include <lua.h>
#include <lauxlib.h>
#include <stdio.h>
/**
* 定义在lua中可调用的函数,要遵循规范:返回值必须为int,需传入lua_State
*/
static int test(lua_State *L);
int luaopen_dbg(lua_State *L);
#include "dbg.h"
static int test(lua_State *L)
{
size_t len = 0;
int num = luaL_checkinteger(L, 1);
const char *str = luaL_checklstring(L, 2, &len);
printf("come from test: num = %d str = %s len = %d\n", num, str, len);
return 0;
}
int luaopen_dbg(lua_State *L)
{
luaL_Reg l[] =
{
{"test", test},
{NULL, NULL}};
// luaL_newlib(L, l); // lua504才有这个函数
luaL_register(L, "dbg", l);
return 1;
}
定一个了一个dbg模块,在使用时将编译好的dbg.dll放在和lua.5.1.dll同目录,直接require,调用相关的函数即可
local lib = require(libName)
lib:test()
用法
dll的用法有点类似模块化开发,我们可以将不同的功能封装为一个模块,并编译为dll提供给别人使用,如果模块发生了更新,我只需要更新这个模块的dll就行了。
我还见过一种用法,你希望自己的应用软件仅仅是个壳,具体的实现放到了dll中,使用lua脚本调用dll,完成逻辑的执行,这种模式下的软件,其实dll非常有用,做WG的最喜欢这种方式。
在手游开发中,很少使用到这种技术,因为动态库有点水土不服。