我是靠谱客的博主 俊秀棒球,最近开发中收集的这篇文章主要介绍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,然后是mylib.dll,然后是lua包。lua包我们这里先不讨论,现在总结一下:就是
(1)先搜索当前路径下有没有my.dll
(2)继续搜索其他路径下有没有my.dll
(3)搜索当前目录下有没有mylib.dll
(4)继续搜索其他路径下有没有mylib.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_*函数的使用)
LUA require 搜索路径指定方法

最后

以上就是俊秀棒球为你收集整理的Lua调用C库之require("xx.xx")类型包的命名规则的全部内容,希望文章能够帮你解决Lua调用C库之require("xx.xx")类型包的命名规则所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部