概述
在看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")类型包的命名规则所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复