skynet添加动态库爬坑记录

来源:互联网 发布:天津网络推广和seo 编辑:程序博客网 时间:2024/06/06 21:40
  1. luaxx.lib 从dll 导出
    pexports lua53.dll > lua53.def
    dlltool -D lua53.dll -d test.def -l test.lib
    dlltool 是mingw自带的,
    pexport mingw默认没安装,要mingw-get install pexports

  2. undefined reference to `lua_getfield’
    导出dll时gcc -shared -o dlltest.dll dlltest.o
    是没有把lualib link进来导致链接失败

  3. 执行 gcc -shared -o dlltest.dll dlltest.o -lua53 错误:cannot find -lua53
    要加添参数L,表示要查找的lib目录在哪, -L.表示当前目录。
    gcc -shared -o dlltest.dll dlltest.o -L. -llua53

    1. 编译阶段 说 lua.h找不到
      因为没有指定头文件目录,加上-I 例如gcc -c dlltest.c -Isrc

    2. dlltest.c: In function ‘luaopen_dlltest’:
      dlltest.c:28:5: warning: implicit declaration of function ‘luaL_register’ [-Wimplicit-function-declaration]
      luaL_register(L, “dlltest”, mylib);
      luaL_register(<5.3才有) 在5.3是没有的,换成 luaL_newlib(L, mylib)(5.3才有);
      并且mylib 是要注册过的

  4. skynet提示 在一下路径找不到dlltest
    他会去查找一些目录下的dlltest.so,dlltest.lua 但不会去查找dll格式的文件
    所以链接阶段改成so即可

  5. skynet以及tolua中都有很多Makefile文件,这个要用到mingw 的make命令,将mingw根目录makexxx改名放入环境变量中就可以使用make,会查找makefile文件,执行里面的东西。用来处理复杂的编译、链接过程的。 所以如果是新增的,可以将内容放入他自身的makefile里面,就不用重复那么多上面的步骤了。

提上dlltest.c 代码

#include <Windows.h>  #include <lua.h>  #include <lauxlib.h>  #include <stdio.h>  #include <stdlib.h>  #include <stdarg.h>  #include <lualib.h>  #include <math.h>  static int mysin (lua_State *L)   {      double d = luaL_checknumber(L, 1);      lua_pushnumber(L, 999);      return 1;  }  static const struct luaL_Reg mylib[] =   {      {"mysin", mysin},       {NULL, NULL}  };  int __declspec(dllexport) luaopen_dlltest(lua_State *L)  {      luaL_newlib(L, mylib);      //luaL_register(L, "dlltest", mylib);    return 1;  }  

添加到skynet后结果
这里写图片描述