其他分享
首页 > 其他分享> > Lua调用C库之require("xx.xx")类型包的命名规则

Lua调用C库之require("xx.xx")类型包的命名规则

作者:互联网

在看skynet中遇到类似require(“skynet.core”)或者require "skynet.core"这样写的,对于这个中间有.的包名,如果C库写的,那么这个文件的命名应该是怎么样的呢?
在windows上这样的文件是xx.dll,linux上是xx.so,我们来了解一下这样的动态库怎么写和命名。
以windows上为例:
(具体怎么将main.c编译成lua调用的dll,可以查看https://blog.csdn.net/hp_cpp/article/details/104572573

main.c文件:

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

static int add(lua_State* L)
{
	double op1 = luaL_checknumber(L, 1);//去栈中拿参数
	double op2 = luaL_checknumber(L, 2);
	lua_pushnumber(L, op1 + op2);//把结果入栈
	return 1;//返回值的个数
}

static int sub(lua_State* L)
{
	double op1 = luaL_checknumber(L, 1);
	double op2 = luaL_checknumber(L, 2);
	lua_pushnumber(L, op1 - op2);
	return 1;
}

static luaL_Reg mylibs[] =
{
	{"add", add},
	{"sub", sub},
	{NULL, NULL}
};

__declspec(dllexport)//这个很重要,设置这个函数为外部链接 Linux不需要
int luaopen_my_lib(lua_State* L) //函数名很重要这4个一定要这样,
{
	luaL_newlib(L, mylibs);
	return 1;
}

测试的test.lua文件:

local my_math = require("my.lib")
 
print(my_math.add(1, 2))
print(my_math.sub(1, 2))

将该文件放到D:\lua_test文件夹中
先运行test.lua

D:\lua_test>lua test.lua

果然报错:
在这里插入图片描述
堆栈的错误信息是倒过来看的,顺着箭头方向看:
.\my.dll,loadall.dll,然后是my\lib.dll,然后是lua包。lua包我们这里先不讨论,现在总结一下:就是
(1)先搜索当前路径下有没有my.dll
(2)继续搜索其他路径下有没有my.dll
(3)搜索当前目录下有没有my\lib.dll
(4)继续搜索其他路径下有没有my\lib.dll
其中loadall.dl是一个特殊的名字,你就理解成lua官方指定的,咱们自己生成的C库就不会叫这名字。
通过错误信息,已经很清楚了。有两种命名方式:
一种是叫my.dll(linux平台上的为my.so,以下类似)
第二种是在文件夹my下油锅lib.so库
路径的话,首先是当前目录,然后是lua的C库的搜索路径(这里不讨论lua包)
我们实际操作以下,将main.c生成的动态库,通过以下两种命名方法测试一下:
方式一:
在这里插入图片描述
运行结果:
在这里插入图片描述
方式二:
在这里插入图片描述
在这里插入图片描述
运行结果:
在这里插入图片描述
回头我们再看看:

int luaopen_my_lib(lua_State* L)

这个luaopen_my_lib
luaopen_xx_xx,或者叫luaopen_xx,这个要和你生成的.dll(或者.so)文件名对应,这就是本文讨论的问题。

参考:
lua动态链接库(luaopen_*函数的使用)

hp_cpp 发布了112 篇原创文章 · 获赞 34 · 访问量 13万+ 私信 关注

标签:lib,lua,require,dll,Lua,xx,my,luaL
来源: https://blog.csdn.net/hp_cpp/article/details/104625774